スカラ関数型プログラミングの学習の練習として、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ランタイムほど進んでいないのですか?
ScalaのコードはコンパイルとJUnitから、ないcalc_pascal(C-1、R)' –
REPLから実行することにより、日食で実行されたでパスカルの数パフォーマンス(C、R -1) ' –
これを落とした人は誰だと言うべきでしょうか...なぜなら... downvotingに関するよくある質問から:明らかにそうではない、著しく汚い、無駄に費やされた投稿... –