Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: recursion, stack overflow, call stack, infinite loop, maximum call stack size exceeded

Что произойдет при бесконечной рекурсии?

Вопрос проверяет понимание механизма рекурсии и её ограничений, а также последствий превышения лимита стека вызовов.

Короткий ответ

При бесконечной рекурсии функция постоянно вызывает саму себя, не достигая условия выхода. Каждый вызов добавляет новый фрейм в стек вызовов. Когда стек переполняется, среда выполнения (например, JavaScript) генерирует ошибку "Maximum call stack size exceeded" и выполнение программы аварийно завершается. Это критическая ошибка, которую необходимо предотвращать корректным базовым случаем в рекурсивной функции.

Длинный ответ

Рекурсия — это техника, при которой функция вызывает саму себя для решения задачи, разбивая её на более мелкие подзадачи. Бесконечная рекурсия возникает, когда отсутствует корректный базовый случай (условие остановки) или когда рекурсивные вызовы никогда не сходятся к этому случаю.

Механизм стека вызовов

Каждый вызов функции сохраняет в стеке вызовов контекст выполнения: локальные переменные, аргументы и место возврата. При бесконечной рекурсии новые фреймы непрерывно добавляются, пока не исчерпается выделенная память под стек.

Пример ошибки

Рассмотрим классический пример на JavaScript:

function infiniteRecursion() {
    // Нет условия остановки — функция всегда вызывает себя
    return infiniteRecursion();
}

// Попытка вызова приведёт к ошибке:
// "Uncaught RangeError: Maximum call stack size exceeded"
infiniteRecursion();

Практические последствия

  • Аварийное завершение: Программа падает с ошибкой, что неприемлемо в продакшене.
  • Отладка: Стек трейс будет очень длинным, но он покажет повторяющийся паттерн вызовов.
  • Предотвращение: Всегда определяйте чёткий базовый случай и убедитесь, что рекурсивный шаг приближает к нему.

Корректный пример рекурсии

Вот функция для вычисления факториала с условием остановки:

function factorial(n) {
    // Базовый случай: факториал 0 или 1 равен 1
    if (n <= 1) {
        return 1;
    }
    // Рекурсивный шаг: n * факториал(n-1)
    return n * factorial(n - 1);
}
console.log(factorial(5)); // 120

Вывод: Бесконечную рекурсию необходимо избегать, так как она приводит к переполнению стека и краху программы. Рекурсивные алгоритмы следует проектировать с гарантированным достижением базового случая, а для глубокой рекурсии иногда стоит рассмотреть итеративные решения или оптимизации (хвостовая рекурсия, если поддерживается).

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

Ключевые слова

#recursion

#stack overflow

#call stack

#infinite loop

#maximum call stack size exceeded

Подпишись на Java Developer в телеграм