Ответ
Бесконечная или слишком глубокая рекурсия приводит к переполнению стека вызовов (StackOverflowError). Каждый рекурсивный вызов добавляет новый фрейм в стек, который хранит локальные переменные и адрес возврата. При исчерпании лимита стека JVM аварийно завершает поток.
Пример проблемного кода:
void recursiveMethod() {
recursiveMethod(); // Бесконечный вызов без условия выхода
}
Основные причины и решения:
- Отсутствие базового случая (base case): У каждой рекурсивной функции должно быть условие, при котором она завершается без нового вызова.
- Некорректная логика: Рекурсивный шаг не приближает к базовому случаю.
- Слишком большая глубина: Для задач с глубокой рекурсией (например, обход глубокого дерева) предпочтительнее использовать итеративный подход (стек/очередь) или хвостовую рекурсию (хотя JVM не оптимизирует ее автоматически).
Правильный пример с базовым случаем:
int factorial(int n) {
if (n <= 1) { // Базовый случай
return 1;
}
return n * factorial(n - 1); // Рекурсивный шаг
}