Andy Lanng Ответов: 3

Как предотвратить переполнение стека, когда я пытаюсь его показать?


Я пишу экзамен на c#.

У меня есть следующий вопрос

/// <summary>
///     This is a huge problem for any coder.  Can you correct the code and
///     describe the issue it causes?
/// </summary>
/// <param name="count"></param>
public void Recursion(int count)
{
   if (count < 20)
   {
       Recursion(count++);
   }
}


Есть ли какой-нибудь способ написать тест для решения проблемы без риска провала экзамена?

Что я уже пробовал:

Я попробовал свойство, класс, но ничто из того, что я пробовал, не может иметь такого же эффекта, как заставить испытуемого показать, что он знает разницу между ++var и var ++

3 Ответов

Рейтинг:
27

OriginalGriff

Если вы посмотрите на это внимательно, это довольно очевидно.

Подумайте о том, что на самом деле делает постфиксная операция. Это может помочь: Почему x = ++x + x++ дает мне неправильный ответ?[^]


Andy Lanng

Мне нравится эта идея ^_^

jsc42

Я думаю, что ОП знает, в чем проблема с кодом. Его / ее qn состоял в том, как решения проблемы, представленные испытуемыми, могут быть безопасно протестированы.

OriginalGriff

Вот почему я предложил эту статью! :смеяться:

Рейтинг:
2

lmoelleb

1. Настроить Событие manualresetevent [^]

2. Создайте и запустите новый поток Использование потоков и многопоточности | Microsoft Docs[^] что:
a. вызывает тестируемый метод
б. Задает событие manualresetevent, который вы создали в шаге 1

3. (в исходном потоке): вызовите Метод manualreseteventslim.Метод Ожидания (System.Продевать Нитку) | Майкрософт Документы[^] с разумным таймаутом (секунды должно быть достаточно, если вы не звоните с int.MinValue).

4. Если ожидание вернуло false, позвоните Нить.Метод Прерывания (System.Продевать Нитку) | Майкрософт Документы[^] и провалить тест.

Если бы он должен был быть действительно надежным, я бы рассмотрел возможность переноса теста на другой домен приложения или процесс. Наличие потока, исчерпавшего пространство стека в вашем основном процессе, кажется мне несколько рискованным, в конце концов, он действительно делит адресное пространство со всем остальным. И помните, что хотя этот тест специально разработан для начального запуска из пространства стека, любой ответ на любой тест может сделать это случайно. И они также могут вызывать команды для форматирования диска "случайно", но я предполагаю, что вы не запускаете случайный код людей на своем собственном сервере. :)


Dave Kreskowiak

Да, это слишком много для такой простой задачи. Кроме того, это простой вопрос на тесте.

Существуют и другие способы проверки знаний операторов pre и post fix, не вдаваясь в рекурсию.

lmoelleb

Извините, кажется, я допустил ошибку, ответив на заданный вопрос, так что, думаю, я заслуживаю низкого голоса. :П
Я бы тоже выбрал другой тест, но если бы я хотел запустить тест, который был задан изначально, то это способ. Или просто используйте тестовую платформу, которая позволяет пользователю отменить тест, если он работает в бесконечном цикле (что, насколько мне известно, почти все из них).

Рейтинг:
1

CPallini

Я предлагаю вам два небольших теста.

  • Добавьте строку, печатающую count значение в самом начале процесса Recurse метод.
Затем
  • Измените рекурсивный вызов, используя оператор предварительного инкремента (++cout) вместо пост-инкремент один.