说我有一个尾递归的递归函数。
System.out.println( sum(Arrays.asList(0, 1, 2, 3, 4, 5)) );
int sum(List<Integer> integers) {
if (integers.isEmpty())
return 0;
else
return integers.get(0) + sum(integers.subList(1, integers.size()));
}
我想知道这个函数是sum
在堆栈上增长还是会变成循环(因为它是一个尾递归函数)?
我刚刚读到Scala可以检测到此类调用并对其进行优化,但这通常是Scala专用的东西还是JVM?
Java支持尾递归调用,但AFAIK并没有优化它们。我认为只是Scala编译器能够做到这一点,而不是JVM本身。退房@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
函数,它具有一个到目前为止计算出的sum参数。这样,当您在else
分支中递归时,您不再需要实际的堆栈框架-您在递归调用中获得了所有需要的函数参数。
在您的代码段中,只要递归调用,堆栈框架可能就必须存在。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句