首页 > 代码库 > JVM原生不支持尾递归优化,但是Scala编译器支持
JVM原生不支持尾递归优化,但是Scala编译器支持
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 (); } }
JVM原生不支持尾递归优化,但是Scala编译器支持
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。