Не могу понять эту рекурсивную функцию - PullRequest
0 голосов
/ 14 сентября 2018

Как это дает результат от 1 до 10? Не должен ли результат быть 0? Во время отладки я вижу, что cout в конце называется несколькими временами, но где выполняется добавление?

#include <iostream>
using namespace std;
void func(int n);
int main()
{
    func(10);
    return 0;
}

void func(int n)
{
    if (n <= 0)
        return;
    else

        func(n - 1);

    cout << n << endl;

}

выход

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Так что в основном рекурсивная функция продолжает вызывать себя, пока не вернет значение.Поэтому, если вы сделали func (2), он проверяет, что 2 <= 0, затем вызывает func (2-1), не печатая, пока этот новый вызов не завершится.Затем он проверяет, если 2-1 <= 0, вызывает func (1-1), все еще не печатая до завершения новой функции.Теперь он видит, что 1-1 равен <= 0, поэтому он возвращает 0. Теперь предыдущий вызов функции может продолжиться, и он печатает 2-1 = 1. Затем предыдущая предыдущая функция может продолжить и она печатает 2. Надеюсь, что это имеет смысл. </p>

0 голосов
/ 14 сентября 2018

Каждый раз, когда вы вызываете функцию, вы помещаете ее кадр стека в call stack.Кадр стека состоит из параметров функции, ее локальных переменных и адреса возврата.Когда вы сначала вызываете func(), вы передаете значение 10, а затем внутри func() вы снова набираете func() с 9. Вы продолжаете звонить func() с n-1, пока не достигнете 0, после чегоВы возвращаетесь.Ваш стек вызовов будет выглядеть примерно так:

frame containing 1
frame containing 2
...
frame containing 10

Стек будет «раскручиваться», начиная сверху и опускаясь вниз.Каждая функция в стеке будет начинаться с того места, где она остановилась, что составляет cout, поэтому каждое значение будет распечатываться при разматывании стека.

Я бы порекомендовал прочитать в стеке вызовов, чтобы узнать больше.

0 голосов
/ 14 сентября 2018

Хорошо, я проведу вас через это.Мы все боролись с программированием в начале, поэтому я не против помочь.

func (10) называется

10 больше, чем 0

func (9) называется

9 больше 0

и т. д.

func (1) называется

1 больше 0

func (0) вызывается

0 == 0

return

После возврата из функции она вызывает каждый оператор cout на пути назад до 10,потому что функция не может вызывать ее до тех пор, пока все вызовы func не вернутся или не достигнут конца функции

Таким образом, при выходе она выводит 1,2,3,4 .... 10

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