假设我有一个尾递归的递归函数。我想知道这个函数是否会被实现为递归,在堆栈上增长,或者它会被更改为循环(因为它是一个尾递归函数)?
我刚刚读到 Scala 会检测此类调用并对其进行优化,但这是 Scala 专用的东西还是一般的 JVM?
最佳答案
Java 支持尾递归调用,但据我所知,它并没有优化它们。我认为是 Scala 编译器能够做到这一点,而不是 JVM 本身。查看 Scala 中的 @tailrec
注释,了解编译器的更多功能:)
但无论 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
分支中重复出现时,您不再需要实际的堆栈帧 - 您在递归调用中获得了所有需要的函数参数。
在您的代码段中,只要递归调用,堆栈框架就可能必须存在..
关于java - Java 是否支持和优化尾递归调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20826786/