2012-09-23 10 views
5

スカラ関数型プログラミングの学習の練習として、pascal's numberを計算する次の非末尾再帰式を実装しました。プログラム自体は、パスカルの三角形の定義として機能します。 (2.53 GHzのIntel Core 2 Duoプロセッサ)は、Mac OS X 10.6.8上でpascal(25,50)のために実行しようとすると、しかし、それはまだ20分後に実行が終了していないerlang対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) 

を次のようにそれは絵になります。ただ、アーランと比較する

、私はR15B02をインストールし、次のように同等のプログラムを書いた:

-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)仕上げを〜4秒に。

なぜこのような大きなパフォーマンスの違いが生じるのでしょうか? jvmは再帰的プログラムのerlangランタイムほど進んでいないのですか?

+0

ScalaのコードはコンパイルとJUnitから、ないcalc_pascal(C-1、R)' –

+2

REPLから実行することにより、日食で実行されたでパスカルの数パフォーマンス(C、R -1) ' –

+0

これを落とした人は誰だと言うべきでしょうか...なぜなら... downvotingに関するよくある質問から:明らかにそうではない、著しく汚い、無駄に費やされた投稿... –

答えて

13

Erlangバージョンで作成したScalaプログラムで同じ誤りがあった場合、非常に高速に実行されます。これが理由だろうか?

+0

おっと! Erlangプログラムは修正され、永遠に実行されているようです。指摘してくれてありがとう。私はこのエレガントな再帰的な実装はスケーラブルではないと思う:( –

3

`calc_pascalなければならない。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