作为学习scala和函数式编程的练习,我实现了以下非尾递归def,它可以在任何位置计算pascal's number。程序本身作为pascal三角形的定义。它看起来如下图
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)上运行pascal(25,50)
时,它仍然在 20 min 之后仍未运行。
为了与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)
在 ~4秒完成。
为什么可能出现如此巨大的性能差异? jvm不像递归程序的erlang运行时那样先进吗?
答案 0 :(得分:13)
如果我在你在Erlang版本中制作的Scala程序中犯了同样的错误,那么它的运行速度非常快。这可能是原因吗?
答案 1 :(得分:3)
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