Я работаю над довольно простым упражнением по отслеживанию, однако я не совсем понимаю, почему решение такое, какое оно есть …
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 … спасибо за вашу помощь.
Рассмотрим простой случай вызова 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)
, Когда вы застреваете, думая о рекурсивных программах, рассмотрите базовые случаи, а затем обобщите. Напишите код, заменив параметры функции фактическими аргументами.
Это делает попасть на выходную строку после рекурсивного вызова f
возвращается.
Важной частью здесь является условие остановки:
if (n>0)
Это делает рекурсивный вызов, только если n
больше нуля. И как рекурсивный вызов с аргументом n - 1
он будет все ниже и ниже, пока не станет нулевым, и звонки больше не будут выполняться.
Проследим за вами, так как вы должны ленивый сделать это самостоятельно в отладчике (или на бумаге):
main
сделан. n == 5
и явно больше нуля, поэтому рекурсивный вызов выполняется с 5 - 1
n == 4
, все еще больше нуля, поэтому вызов выполняется снова с 4 - 1
n == 3
, все еще больше нуля, поэтому вызов выполняется снова с 3 - 1
n == 2
, все еще больше нуля, поэтому вызов выполняется снова с 2 - 1
n == 1
, все еще больше нуля, поэтому вызов выполняется снова с 1 - 1
n == 0
, который не больше нуля, поэтому больше вызовов не производится, и функция возвращается.n == 1
, так что 1
печатается, а затем функция возвращаетn == 2
, так что 2
печатается, а затем функция возвращаетn == 3
, так что 3
печатается, а затем функция возвращаетn == 4
, так что 4
печатается, а затем функция возвращаетn == 5
, так что 5
печатается, а затем функция возвращается к main
функцияТо есть, вот как это должно было работать, если скомпилировано. Теперь это даже не зашло так далеко, поскольку у вас будут ошибки компилятора (с кодом, показанным в вашем вопросе).