作爲學習scala和函數式編程的練習,我實現了以下非尾遞歸def,它可以在任何位置計算pascal's number。程序本身就是帕斯卡三角形的定義。它看起來繪畫方式如下erlang vs jvm(scala)遞歸性能
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
...
def pascal(c: Int, r: Int): Int =
if (c == 0 || c == r) 1 else pascal(c - 1, r - 1) + pascal(c, r - 1)
但是試圖爲pascal(25,50)
在Mac OS X 10.6.8上運行時(2.53 GHz的英特爾Core 2 Duo),它仍然沒有完成20分鐘後運行。
只是爲了使用Erlang比較,我安裝R15B02並寫上相等的程序如下:〜4秒
-module(pascal).
-export([calc_pascal/2]).
calc_pascal(0,_) -> 1;
calc_pascal(C,R) when C==R -> 1;
calc_pascal(C,R) when C<R -> calc_pascal(C-1,R-1) + calc_pascal(C-1,R).
pascal:calc_pascal(25,50)
完成。
爲什麼會出現如此巨大的性能差異?對於遞歸程序,jvm不像erlang運行時那樣高級?
Scala代碼在蝕通過編譯並從junit的,而不是從REPL –
'calc_pascal(C-1,R)上運行的運行'應該是'calc_pascal(C,R -1)' –
誰低估了這一點,應該評論爲什麼...從downvoting的常見問題:「極其潦草,毫不費力的帖子」,顯然不是這種情況...... –