标签:java io strong ar for sp on new ad
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 (); } }
标签:java io strong ar for sp on new ad
原文地址:http://my.oschina.net/magicly007/blog/308210