Вопрос проверяет понимание механизма рекурсии и её ограничений, а также последствий превышения лимита стека вызовов.
Рекурсия — это техника, при которой функция вызывает саму себя для решения задачи, разбивая её на более мелкие подзадачи. Бесконечная рекурсия возникает, когда отсутствует корректный базовый случай (условие остановки) или когда рекурсивные вызовы никогда не сходятся к этому случаю.
Каждый вызов функции сохраняет в стеке вызовов контекст выполнения: локальные переменные, аргументы и место возврата. При бесконечной рекурсии новые фреймы непрерывно добавляются, пока не исчерпается выделенная память под стек.
Рассмотрим классический пример на 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Вывод: Бесконечную рекурсию необходимо избегать, так как она приводит к переполнению стека и краху программы. Рекурсивные алгоритмы следует проектировать с гарантированным достижением базового случая, а для глубокой рекурсии иногда стоит рассмотреть итеративные решения или оптимизации (хвостовая рекурсия, если поддерживается).