2012-09-23 31 views
5

作爲學習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運行時那樣高級?

+0

Scala代碼在蝕通過編譯並從junit的,而不是從REPL –

+2

'calc_pascal(C-1,R)上運行的運行'應該是'calc_pascal(C,R -1)' –

+0

誰低估了這一點,應該評論爲什麼...從downvoting的常見問題:「極其潦草,毫不費力的帖子」,顯然不是這種情況...... –

回答

13

如果我在Erlang版本的Scala程序中犯了同樣的錯誤,它運行得非常快。這可能是原因嗎?

+0

哎呀! Erlang程序糾正了,它似乎也永遠在運行。感謝您指出。我猜這個優雅的遞歸實現不可伸縮:( –

3

帕斯卡號碼性能以ms

c,r  Scala Erlang 
10,20 21  22 
11,22 6  72 
12,24 16  272 
13,26 71  1034 
14,28 299  3982 
15,30 802  16124 
16,32 3885 60420