PassFront
  1. PassFront
  2. База знаний
  3. Массивы и структуры данных

Как будешь действовать, если стек вызовов будет заполнен?

Массивы и структуры данных

Если стек вызовов переполнен (`Maximum call stack size exceeded`), нужно найти причину — обычно бесконечную/слишком глубокую рекурсию — и исправить: добавить базовый случай, переписать в итерацию или разбить работу.

Причина переполнения

Стек вызовов ограничен по размеру. Переполнение обычно вызвано:

  • Бесконечной рекурсией (нет базового случая).
  • Слишком глубокой рекурсией (большая глубина).
function recurse() { recurse(); } // RangeError: Maximum call stack size exceeded

Как действовать

1. Найти причину

Прочитать stack trace — он покажет повторяющуюся функцию. Проверить рекурсию на базовый случай:

function factorial(n) {
  if (n <= 1) return 1; // базовый случай — обязателен!
  return n * factorial(n - 1);
}

2. Исправить рекурсию

  • Добавить/проверить базовый случай.
  • Убедиться, что рекурсия приближается к нему.

3. Переписать в итерацию

Глубокую рекурсию заменить циклом (использует память кучи, а не стек):

function sum(arr) {
  let total = 0;
  for (const x of arr) total += x; // без рекурсии
  return total;
}

4. Разбить работу / асинхронность

Для очень глубокой обработки — обрабатывать частями через setTimeout/очередь (стек освобождается между итерациями).

5. Явный стек

Обход деревьев через явный стек-массив вместо рекурсии.

Коротко для собеседования

При переполнении стека (Maximum call stack size exceeded) — читаю stack trace, нахожу бесконечную/глубокую рекурсию, проверяю базовый случай и его достижимость. Исправляю: добавляю базовый случай, переписываю рекурсию в итерацию (цикл/явный стек) или разбиваю работу через setTimeout/очередь, чтобы стек освобождался.

Другие вопросы раздела