標籤: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表示毫無壓力。
可以講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編譯器支援