В большинстве языков есть оптимизация компилятора для хвостовой рекурсии . Хвостовая рекурсия означает, что рекурсивный вызов должен быть последним вызовом вашего рекурсивного метода. Затем компилятор может оптимизировать это в цикл, предотвращая ошибки переполнения стека.
Я не уверен, все ли реализации javac
реализуют хвостовую рекурсию. Это не то, что требуется в спецификации. Тем не менее, это важный метод оптимизации для любой рекурсивной программы, поэтому я предполагаю, что основные реализации предоставляют хвостовую рекурсию.
Вы можете проверить это самостоятельно, взяв (простую) нерекурсивную программу, которая генерирует StackOverflowError
и делает ее хвостовой рекурсивной (например, вычисляя factorial ).
РЕДАКТИРОВАТЬ : ранее был вопрос о хвостовой рекурсии в Java, как указано в комментарии пользователя sje397. Также взгляните на ответ Стивена С. на этот вопрос, который дает дополнительную информацию.