Каковы последствия бесконечной рекурсии в Java?

«Каковы последствия бесконечной рекурсии в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Бесконечная или слишком глубокая рекурсия приводит к переполнению стека вызовов (StackOverflowError). Каждый рекурсивный вызов добавляет новый фрейм в стек, который хранит локальные переменные и адрес возврата. При исчерпании лимита стека JVM аварийно завершает поток.

Пример проблемного кода:

void recursiveMethod() {
    recursiveMethod(); // Бесконечный вызов без условия выхода
}

Основные причины и решения:

  1. Отсутствие базового случая (base case): У каждой рекурсивной функции должно быть условие, при котором она завершается без нового вызова.
  2. Некорректная логика: Рекурсивный шаг не приближает к базовому случаю.
  3. Слишком большая глубина: Для задач с глубокой рекурсией (например, обход глубокого дерева) предпочтительнее использовать итеративный подход (стек/очередь) или хвостовую рекурсию (хотя JVM не оптимизирует ее автоматически).

Правильный пример с базовым случаем:

int factorial(int n) {
    if (n <= 1) { // Базовый случай
        return 1;
    }
    return n * factorial(n - 1); // Рекурсивный шаг
}