我在 StackOverflow 上找到了两种不同的解决方案来计算斐波那契数。一个使用 a lambda,如下所示:
f = ->(x){ x < 2 ? x : f[x-1] + f[x-2] }
f[6] # => 8
另一个使用 a Hash:
f = Hash.new{ |h,k| h[k] = k < 2 ? k : h[k-1] + h[k-2] }
f[6] # => 8
版本比Hash版本快lambda。
Benchmark.bm do |x|
x.report { f[35] }
x.report { fibonacci[35] }
end
user system total real
7.332000 0.000000 7.332000 (7.349421)
0.000000 0.000000 0.000000 (0.000000)
该lambda版本甚至无法f[100]在合理的时间内Hash进行计算,而该版本可以fibonacci[1000]在不到一微秒的时间内进行计算。为什么Hash版本更快?