Рекурсия для пользовательского ввода - элегантно или странно? - PullRequest
1 голос
/ 19 января 2009

Dev-cpp поставляется с примером программы Jackpot, в которой есть функция GetResults:

void
GetResults ()
{
   .
   .
   .

     else if (i>j)
     {
        cout << "Too BIG\n";
        life = life - 1;    // -1 to the user's "life"
        cout << "Number of remaining life: " << life << "\n\n";
        GetResults();
     }

Это элегантный способ неоднократно запрашивать ввод данных пользователем? Конечно, это более читабельно, чем обтекание ~ 20 строк циклом do-while. Мне это нравится, но я не вижу такого часто, поэтому я не уверен. Каково ваше мнение?

РЕДАКТИРОВАТЬ: В вашем примере, глубина рекурсии ограничивается количеством жизней, так что, кажется, все в порядке, поскольку это не будет больше 1000 или даже 100 - именно поэтому я обдумал это, но теперь я вижу, что это была довольно глупая идея :) Интересно, кто включил это в пример программы ...

Спасибо за вклад, ребята!

Ответы [ 3 ]

2 голосов
/ 19 января 2009

Это наверняка приведет к переполнению стека, поэтому этого делать не следует! Зависит от размера стека, как часто вы можете это сделать, но он обязательно рухнет. В вашем примере глубине рекурсии препятствует количество жизней, поэтому это нормально, так как это не будет больше 1000 или даже 100, но вы не должны использовать это вообще.

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

1 голос
/ 19 января 2009

НЕТ! BAD!

Это не очень хороший дизайн. Лучшим способом было бы обернуть его в цикле while для вызывающей стороны. И.Е.

int input = 0;
while (GetInt(&input))
{
    if (input > something)
    {
        cout << "Too big";
        life--;
    }
    else
        break;
}

Вы когда-нибудь задумывались, что такое StackOverflow? Попробуйте ввести слишком большое число для написания кода, и вы узнаете:)

1 голос
/ 19 января 2009

Это не очень хороший метод, если только вы не хотите проверить размер стека вашего приложения. ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...