Ответ 1
Java поддерживает хвостовые рекурсивные вызовы, но AFAIK не оптимизирует их. Я думаю, что это компилятор Scala, который просто способен на это, а не на JVM. Просмотрите аннотацию @tailrec
в Scala, чтобы узнать, что может сделать компилятор:)
Но независимо от того, оптимизирует ли Java/JVM хвостовую рекурсию, ваша функция будет сложнее оптимизировать, чем необходимо.
Посмотрите на это:
int sum(List<Integer> integers) {
return sum(integers, 0);
}
int sum(List<Integer> integers, int sumSoFar) {
if (integers.isEmpty())
return sumSoFar;
else
return sum(
integers.subList(1, integers.size()),
sumSoFar + integers.get(0)
);
}
См., я добавил перегруженный sum
с так называемым рассчитанным параметром суммы. Таким образом, когда вы возвращаетесь в ветвь else
, вам больше не нужен фактический кадр стека - у вас есть все, что вам нужно, в качестве аргументов функции в рекурсивном вызове.
В вашем фрагменте фрейм стека, вероятно, должен существовать до тех пор, пока рекурсивный вызов.