стеки понимания простой трассировки рекурсии

Я работаю над довольно простым упражнением по отслеживанию, однако я не совсем понимаю, почему решение такое, какое оно есть …

void f( int n) {
if (n>0) {
f(n-1)
cout << n << " ";
}
}

int main () {
f(5);
return 0;
}

Ответ: 1 2 3 4 5, но мне интересно, как это так, поскольку каждый раз, когда вызывается функция f, она никогда не попадает в строку cout … Я понимаю, что существует система стекирования, в которой последняя реализованная функция посмотрел, однако до факторного примера, где он вернул значение, умноженное на предыдущий n, я не понимаю, как это похоже. Пожалуйста, не используйте пример факториала снова, я его понимаю, но я не понимаю, как здесь реализован cout … спасибо за вашу помощь.

-1

Решение

Рассмотрим простой случай вызова f(1), Мы передаем if проверить и сделать рекурсивный вызов f(0), Этот вызов вернется бездействующим и продолжит выполнение тела f(1), Следующее утверждение — это призыв к std::cout << 1 << " ";:

// Substitute the parameter with the passed in argument n = 1
void f(1) {
if (1 > 0) {
f(0);
std::cout << 1 << " ";
}
}

Теперь вы должны быть в состоянии справиться со случаем f(2)и вообще f(n), Когда вы застреваете, думая о рекурсивных программах, рассмотрите базовые случаи, а затем обобщите. Напишите код, заменив параметры функции фактическими аргументами.

0

Другие решения

Это делает попасть на выходную строку после рекурсивного вызова f возвращается.

Важной частью здесь является условие остановки:

if (n>0)

Это делает рекурсивный вызов, только если n больше нуля. И как рекурсивный вызов с аргументом n - 1 он будет все ниже и ниже, пока не станет нулевым, и звонки больше не будут выполняться.

Проследим за вами, так как вы должны ленивый сделать это самостоятельно в отладчике (или на бумаге):

  1. Первый звонок от main сделан. n == 5 и явно больше нуля, поэтому рекурсивный вызов выполняется с 5 - 1
  2. Во втором звонке n == 4, все еще больше нуля, поэтому вызов выполняется снова с 4 - 1
  3. На третьем звонке n == 3, все еще больше нуля, поэтому вызов выполняется снова с 3 - 1
  4. В четвертом звонке n == 2, все еще больше нуля, поэтому вызов выполняется снова с 2 - 1
  5. На пятом звонке n == 1, все еще больше нуля, поэтому вызов выполняется снова с 1 - 1
  6. В шестом звонке n == 0, который не больше нуля, поэтому больше вызовов не производится, и функция возвращается.
  7. Возвращает к n == 1, так что 1 печатается, а затем функция возвращает
  8. Возвращает к n == 2, так что 2 печатается, а затем функция возвращает
  9. Возвращает к n == 3, так что 3 печатается, а затем функция возвращает
  10. Возвращает к n == 4, так что 4 печатается, а затем функция возвращает
  11. Возвращает к n == 5, так что 5 печатается, а затем функция возвращается к main функция

То есть, вот как это должно было работать, если скомпилировано. Теперь это даже не зашло так далеко, поскольку у вас будут ошибки компилятора (с кодом, показанным в вашем вопросе).

0

По вопросам рекламы [email protected]