Смущен выводом этой рекурсивной функции - PullRequest
0 голосов
/ 25 февраля 2020

Я только учусь рекурсии, и я запутался в выводе этой рекурсивной функции.

int Run(int x)
{
    if (x > 0)
        cout << Run(x - 1) << " ";
    return x;
}

Если я вызову эту функцию с помощью Run (5), я получу вывод: 0 1 2 3 4

Я ожидал получить вывод: 0 1 2 3 4 5.

Я не понимаю, почему 5 не возвращается в конце вывода. Это значение, которое я подключил к функции, поэтому после того, как все рекурсивные вызовы сделаны, не должна ли функция возвращать то же значение, которое я подключила?

Ответы [ 3 ]

1 голос
/ 25 февраля 2020

Run возвращает 5, но рекурсивные вызовы Run никогда не выполняются, и печатается только возврат рекурсивных вызовов.

Подумайте об этом так: вы печатаете не каждые x, переданные Run; вы печатаете только возврат рекурсивных вызовов. Ваш первый вызов Run, который делает рекурсивные вызовы, возвращает 5, которые вы ожидаете распечатать.

0 голосов
/ 25 февраля 2020

Мы можем видеть, что Run (n) - это функция, которая печатает неотрицательные целые числа меньше n и возвращает n . Это означает, что для Run (n) вы получите вывод 0 1 2 ... n-1, если n положительный.

Что у вас здесь :

cout << Run(x - 1) << " ";

совпадает с

int r = Run(x - 1);
cout << r << " ";

То есть Run (x-1) будет печатать числа меньше x-1 и возврат x-1 . Поэтому, если x == 5 , это означает Выполнить (x-1) и вывести числа от 0 до x-2 и r было установлено на 4 . Затем функция напечатает r и вернется. Если вы все еще в замешательстве, это точно так же, как и:

Run(x - 1);
cout << x-1 << " ";

Поскольку мы знаем, что Run (x-1) всегда будет возвращать x-1 мы можем пропустить сохранение его в переменной и распечатать его напрямую. Хитрость при анализе рекурсивных функций состоит в том, чтобы просто предположить, что они работают - предположить , что Run (x-1) успешно печатает числа от 0 до x-2 - остается только напечатать x-1 .

Так что, как видите, переменная x никогда не получится напечатано, только цифры меньше его. Функция возвращает 5 , но просто никогда не печатает ее.

Если вы хотите, чтобы она печатала неотрицательные целые числа, меньшие или равные до x , внесите эту модификацию:

int Run(int x) {
  if (x >= 0) {
    cout << Run(x-1)+1 << " ";
  }
  return x;
}

Оператор if был изменен и теперь включает в себя 0 , который печатается сейчас. Run (x-1) печатает числа от 0 до x-1 и возвращает x-1 , добавляя 1 к результату позволяет вывести x .

0 голосов
/ 25 февраля 2020

По сути, индекс 0 означает, что ваша функция будет выполнена n раз, где n = целое число аргумента плюс 1. Дело в том, что cout << Run(x - 1) << " "; будет выполняться n-1 раз. Это связано с тем, что первый вызов функции после выполнения всех других рекурсивных вызовов вернет значение x. но так как он не возвращает его предыдущему рекурсивному вызову, который затем отслеживает это значение, он не отображается. попробуйте это cout << Run(int x) на вашей основной функции.

...