Java支持尾递归调用,但是AFAIK并没有优化它们。我认为这是Scala编译器,只是这样做,而不是JVM本身。查看Scala中的@tailrec注释,看看编译器能够做些什么呢:)
但是无论Java / JVM是否优化尾部递归,您的功能将比需要更难优化。
看这个:
int sum(List integers) {
return sum(integers, 0);
}
int sum(List integers, int sumSoFar) {
if (integers.isEmpty())
return sumSoFar;
else
return sum(
integers.subList(1, integers.size()),
sumSoFar + integers.get(0)
);
}
看到,我添加了一个过载的和与一个远的计算的和参数。这样,当您在else分支中重复出现时,您不需要实际的堆栈框架 – 您可以在递归调用中将所有需要作为函数参数。
在您的代码片段中,只要递归调用,堆栈框架可能必须存在。