假设我有一个尾递归的递归函数.
System.out.println( sum(Arrays.asList(0, 1, 2, 3, 4, 5)) ); int sum(Listintegers) { 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
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
的远程计算的sum参数.这样当你在else
分支中重复时,你不再需要实际的堆栈框架了 - 你在递归调用中得到了所有你需要的函数参数.
在您的代码段中,只要递归调用,堆栈帧可能必须存在.