Avatar ·

Как реализовать рекурсию в Java?

Как правильно реализовать рекурсию в Java? Проблема с StackOverflowError

Всем привет! Пытаюсь разобраться с рекурсией в Java, но постоянно сталкиваюсь с ошибкой StackOverflowError. Подскажите, пожалуйста, как правильно организовать рекурсивный вызов метода, чтобы этого избежать?

Написал простую функцию для вычисления факториала числа, но при значении 10000 программа падает. Вот мой код:

public class RecursionTest {
    public static int factorial(int n) {
        if (n == 0) {
            return 1;
        }
        return n * factorial(n - 1);
    }

    public static void main(String[] args) {
        System.out.println(factorial(10000)); // StackOverflowError
    }
}

Я уже пробовал:

  1. Увеличить размер стека через параметры JVM (-Xss2m), но это лишь отодвигает проблему, а не решает её.
  2. Заменить int на long и BigInteger — результат тот же, ошибка в стеке.
  3. Попробовал хвостовую рекурсию (tail recursion), но Java, насколько я знаю, её не оптимизирует.

Ожидаю получить работающий рекурсивный метод для больших чисел (до 100000) без переполнения стека. Может быть, есть какой-то паттерн или альтернативный подход? Нужно ли в таких случаях использовать итерацию вместо рекурсии? Или есть способ заставить JVM оптимизировать рекурсию?

Заранее спасибо за помощь!