5

作为学习 scala 和函数式编程的练习,我实现了以下非尾递归 def 来计算任何位置的帕斯卡数。程序本身作为帕斯卡三角形的定义。如下图所示

      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)

但是,当尝试在 Mac OS X 10.6.8 (2.53 GHz Intel Core 2 Duo) 上运行时,它在20 minpascal(25,50)后仍然没有完成运行。

只是为了和erlang比较,我安装了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)~4sec内完成。

为什么可能是造成如此巨大的性能差异的原因?对于递归程序,jvm 是否不如 erlang 运行时先进?

4

2 回答 2

13

如果我在 Scala 程序中犯了与您在 Erlang 版本中相同的错误,它会运行得非常快。这可能是原因吗?

于 2012-09-23T13:10:46.407 回答
3

帕斯卡的数字表现(以毫秒为单位)

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
于 2012-09-23T14:49:59.217 回答