Я пытаюсь понять рекурсию и нашел нижеприведенный ответ на упражнение по рекурсии freecodecamp по факторизации числа. Это правильно, но я не понимаю, как это работает.
Извините, если это не подходящий вопрос, при первом использовании.
function factorialize(num) {
if (num === 0) { return 1; }
return num * factorialize(num-1);
}
factorialize(5);
>120
Последний вызов с return 1 не возвращается в результате первого вызова factorialize. Он просто возвращается как результат предыдущего вызова factorialize(num-1), который затем умножается на соответствующий num и возвращается как результат предыдущего factorialize(num-1), который умножается на соответствующий num ... и так далее и так далее, пока мы не достигнем первый звонок на factorialize. К этому моменту факториал уже рассчитан.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Поскольку отдельные результаты рекурсивной функции накапливаются, этот процесс можно представить следующим образом:
current value: 5 * factorialize(4)
current value: 5 * 4 * factorialize(3)
current value: 5 * 4 * 3 * factorialize(2)
current value: 5 * 4 * 3 * 2 * factorialize(1)
current value: 5 * 4 * 3 * 2 * 1 * factorialize(0)
current value: 5 * 4 * 3 * 2 * 1 * 1
В результате получается 120.
function factorialize(num) {
if (num === 0) { return 1; } // 7th step
return num * factorialize(num-1); // 1st to 6th step
}
Итеративное написание функции может помочь прояснить ситуацию; каждый шаг в цикле эквивалентен одному рекурсивному вызову.
function factorialize(num) {
let factorial = 1; // base case, equivalent to fact(0)
for (let i = 1; i <= num; i++) { // multiply for each number from 1 to n
factorial *= i;
}
return factorial;
}
console.info(factorialize(5));Рекурсивная функция работает точно так же. fact(n) - это исходный вызов, но для вычисления fact(n) он должен сначала вычислить факториал n - 1. fact(n - 1) невозможно вычислить без fact(n - 2). Каждая функция помещается в стек вызовов, ожидая разрешения функций над ней. В конце концов будет вызван fact(0), и мы знаем, что это 1 на основе рекурсивное определение факториала. fact(0) называется базовый вариант и не выполняет никаких рекурсивных вызовов. Без базового случая n становится все меньше и меньше, пока в стеке не закончится место, что приведет к сбою программы.
Вооружившись информацией из базового варианта, fact(1) теперь может вычислить 1 * 1 и передать результат, 1, вызывающей функции fact(2). fact(2) вычисляет 2 * 1 и передает результат в fact(3), который вычисляет 3 * 2 и передает результат в fact(4), который вычисляет 4 * 6 и передает результат в fact(5), который вычисляет 5 * 24 и возвращает окончательный результат 120.
Если это все еще не имеет смысла, бросьте console.info(), чтобы просмотреть каждый шаг на этом пути:
function factorialize(num) {
if (num === 0) { // base case
console.info("fact(0) returning 1");
return 1;
}
// recursive case
const result = num * factorialize(num - 1);
console.info("fact(" + num + ") returning " + result);
return result;
}
console.info(factorialize(5));
1 возвращает 1, 2 возвращает 2 * (1), 3 возвращает 3 * (2 * (1)) и т. д. (Я использую круглые скобки для обозначения вызова функции внутри самой функции)