Как работает рекурсивная функция с двумя рекурсивными вызовами?

0

В настоящее время я читаю руководство C++, и сейчас я нахожусь в разделе рекурсии, и я немного смущен тем, как этот процесс работает для этой определенной проблемы. Вот код из примера книги:

void subdivide(char ar[], int low, int high, int level)
{
    if (level == 0)
        return;
    int mid = (high + low)/2;
    ar[mid] = '|';
    subdivide(ar, low, mid, level - 1); // #1
    subdivide(ar, mid, high, level -1); // #2
}

До сих пор я понимаю, что рекурсивный вызов # 1 продолжается до тех пор, пока базовый случай не будет 0, а затем, наконец, произойдет рекурсивный вызов # 2. Однако, когда мы сначала активируем вызов # 2, не будет ли он активировать вызов # 1? Или вызов №1 навсегда перестает работать после того, как он будет выполнен, так что каждый раз, когда мы рекурсируем С# 2, он пропускает # 1 и переходит к вызову # 2?

  • 0
    "Как работает рекурсивная функция с двумя рекурсивными вызовами?" Не хорошо, если только он не видит значения, изменяющие void subdivide(char ar[], int &low, int &high, int &level)
  • 0
    Книга не объясняет это? Я предполагаю, что вы читаете учебник C ++ .
Показать ещё 5 комментариев
Теги:

3 ответа

0
Лучший ответ

Первый вызов dosnt перестает работать постоянно. Вызов функции # 1 выполняется снова, каждый раз, когда выполняется вторая (# 2). Также, когда # 1 выполняет, он вызывает вызов # 1 и # 2 и так далее.

  • 0
    Когда мы выполняем # 1, # 2 активируется только тогда, когда базовый вариант для # 1 равен 0, хотя верно?
  • 0
    Когда # 1 вызывается, функция выполняется снова, поэтому снова # 1 вызывается. Затем снова выполняется функция, # 1 вызывается до тех пор, пока уровень не станет 0. Когда уровень становится равным 0, функция возвращается, и все остальные # 2 будут выполняться по одному.
Показать ещё 5 комментариев
0

Вся функция запускается снова, когда вы рекурсируете, с другим начальным состоянием (аргументы и любые сделанные изменения).

То, что заканчивается, - это "дерево" рекурсивных вызовов - два для уровня уровня, грубо - но рекурсия не идет дальше level.

"Нарисуйте забор, если это одна доска, покрасьте его сверху вниз. В противном случае разделите ограждение на две слева направо вдоль края доски. Нарисуйте левую половину, затем правую, используя этот алгоритм".

Это описывает на английском языке аналогичную рекурсивную структуру. В вашем случае мы разделим ваш диапазон на две части, разделим маркер разделителя посередине, а затем повторяем каждую половину.

0

Когда вы возвращаетесь в # 2, вся функция выполняется снова, с новыми значениями аргументов. Это означает, что # 1 не пропускается (если level равен 0, и в этом случае функция немедленно возвращается).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню