При n>0 рекурсивные вызовы перестанут приближаться к базовому случаю, поэтому стек будет расти до ошибки. Итеративный цикл убирает зависимость от глубины вызовов.
Почему рекурсия без продвижения переполняет стек?
При n>0 рекурсивные вызовы перестанут приближаться к базовому случаю, поэтому стек будет расти до ошибки. Итеративный цикл убирает зависимость от глубины вызовов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Функция function sum(n){ if(n===0)return 0; return n+sum(n-1); } предназначена для небольших неотрицательных целых. Как изменится поведение, если рекурсивный вызов заменить на sum(n)? Не запускайте бесконечный вариант; объясните и предложите итеративное решение.
Ответ
При n>0 рекурсивные вызовы перестанут приближаться к базовому случаю, поэтому стек будет расти до ошибки. Итеративный цикл убирает зависимость от глубины вызовов.
function sum(n) {
if (!Number.isInteger(n) || n < 0) throw new RangeError('n');
let result = 0;
for (let i = 1; i <= n; i++) result += i;
return result;
}
Даже исходная корректная рекурсия может превысить ограничение стека на большом n. Для очень больших входов дополнительно учитывают время и точность Number; устранение рекурсии само по себе не снимает эти ограничения.