Почему рекурсия без продвижения переполняет стек?

При 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; устранение рекурсии само по себе не снимает эти ограничения.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее