Вычислить факториал рекурсивно
Реализуйте factorial(n) рекурсивно так, чтобы она возвращала n! для неотрицательного целого n. factorial(5) возвращает 120, а factorial(0) возвращает 1 (базовый случай).
function factorial(n) {
// ваш код здесь
}
Допишите реализацию.
Базовый случай: когда n равно 0 (или 1), вернуть 1. Рекурсивный случай: вернуть n * factorial(n - 1). Каждый вызов умножает n на факториал n - 1, пока базовый случай не остановит рекурсию. Именно базовый случай на 0 обеспечивает, что factorial(0) корректно даёт 1.
- ✗Пропускать базовый случай, вызывая бесконечную рекурсию и переполнение стека
- ✗Рекурсировать к
n + 1вместоn - 1, из-за чего она не завершается - ✗Возвращать
0в базовом случае, что обнуляет всё произведение
- →Почему отсутствие базового случая вызывает переполнение стека
RangeError? - →Как переписать это итеративно, чтобы избежать глубокой рекурсии?
Решение
Базовый случай останавливает рекурсию на 0; рекурсивный случай умножает n на факториал n - 1.
function factorial(n) {
if (n === 0) return 1;
return n * factorial(n - 1);
}
Как это работает
Рекурсия определяет n! как n * (n - 1)!. Каждый вызов уменьшает n на единицу и умножает его на результат вызова для n - 1. Базовый случай n === 0 возвращает 1 и останавливает спуск — без него рекурсия была бы бесконечной и переполнила стек вызовов.
Например, factorial(3) разворачивается в 3 * 2 * 1 * 1 = 6. Базовый случай на 0 также корректно даёт factorial(0) === 1.