The JVM doesn’t support TCO natively, so tail recursive methods will need to rely on the Scala compiler performing the optimization.----------"Scala in Depth" 3.5.2
Jvm本身是不支持尾递归优化得,需要编译器支持,而Java编译器不支持,但是Scala支持。写一个简单的计算1到n的和的递归算法验证一下。
public class TestTailRecursion {
private static long sum(long n, long total) {
if (n <= 0) {
return total;
}
return sum(n - 1, total + n);
}
public static void main(String[] args) {
long sum = sum(100000, 0);
System.out.println(sum);
}
}
10w(可能每个机器不一样)的时候栈溢出。
object TestTailRecursion {
def sum(n: Long, total: Long): Long = {
if (n <= 0) total
else sum(n - 1, total + n)
}
def main(args: Array[String]) {
val total = sum(10000000, 0)
println(total)
}
}
可以讲Scala编译得到的bytecode用JavaDecompiler反编译,看到如下:
import scala.Predef.;
import scala.runtime.BoxesRunTime;
public final class TestTailRecursion$
{
public static final MODULE$;
private TestTailRecursion$()
{
MODULE$ = this;
}
public long sum(long n, long total)
{
for (;;)
{
if (n <= 0L) {
return
total;
}
total += n;n -= 1L;
}
}
public void main(String[] args)
{
long total = sum(10000000L, 0L);
Predef..MODULE$.println(BoxesRunTime.boxToLong(total));
}
static
{
new ();
}
}