Визуализация рекурсии

Пошаговый разбор того, как рекурсивная функция C++ вызывает саму себя: стек вызовов факториала и дерево вызовов Фибоначчи.

Всё моделируется в этом браузере; ничего не отправляется на сервер.

Вызывается factorial(4)

Вызовов: 1 · factorial(4) = 24

Вызывается factorial(4)

Стек вызовов

factorial(4)?
  • Выполняется
  • Ожидает
  • Завершён

Шаг 1 / 16

Код

#include <iostream>
using namespace std;
long factorial(int n) { // Вычисляет n! рекурсивно
if (n == 0) return 1; // Базовый случай: 0! равно 1, дальнейших вызовов нет
long r = n * factorial(n - 1); // Рекурсивный случай: вызвать с n - 1 и умножить
return r; // Возвращает результат вызывающему коду
}
int main() {
int n = 4; // Это значение ползунка
long resultado = factorial(n); // Первый вызов, из main
cout << resultado << endl; // Итоговый результат
return 0;
}

Этот инструмент наглядно объясняет рекурсию на двух классических примерах на C++. На факториале вы видите стек вызовов: каждый вызов factorial(n) помещается в стек как фрейм, пока не будет достигнут базовый случай, а затем фреймы разрешаются один за другим, возвращая значение вызвавшему. На Фибоначчи вы видите дерево вызовов: каждый fib(n) ветвится на fib(n-1) и fib(n-2), а повторные вызовы подсвечиваются, показывая, почему эта рекурсивная версия делает столько лишней работы. Вы выбираете n ползунком, запускаете анимацию по шагам и следите за выполняемой в каждый момент строкой кода. Всё имитируется в вашем браузере.

Как пользоваться

  1. Выберите вкладку «Факториал» или «Фибоначчи» в зависимости от нужного примера.
  2. Измените n ползунком; анимация вернётся к первому шагу.
  3. Нажмите «Пуск» или перемещайтесь кнопками предыдущего и следующего шага, при необходимости измените скорость.
  4. Следите за стеком вызовов или деревом вызовов, счётчиком вызовов и подсвеченной строкой кода C++.

Часто задаваемые вопросы

Что такое рекурсия?
Приём, при котором функция вызывает сама себя для задачи меньшего размера, пока не дойдёт до случая, который решается напрямую, а затем объединяет результаты.
Что такое базовый случай?
Условие, останавливающее вызовы: в факториале n равное 0 возвращает 1, в Фибоначчи n меньше 2 возвращает n. Без базового случая рекурсия никогда не закончится.
Что такое стек вызовов?
Структура, в которой программа хранит все выполняемые вызовы. Каждый вызов помещается в стек при обращении и извлекается при возврате значения по принципу LIFO.
Почему рекурсивный Фибоначчи повторяет работу?
Потому что fib(n) вызывает fib(n-1) и fib(n-2), и эти вызовы многократно заново вычисляют одни и те же значения. Поэтому дерево так быстро растёт, а повторные вызовы подсвечиваются.

Похожие инструменты