(apply-generic op . args)

教育者, 将軍, 栄養士, 心理学者, 親はプログラムする. 軍隊, 学生, 一部の社会はプログラムされる. - 計算機プログラムの構造と解釈 序文

Rubyでフィボナッチのメモ化

仕事つかれたー、なんかリフレッシュしたーい。 なんて時によくフィボナッチを書いて、それをメモ化してにやにやします。 で、今も仕事の合間にそんなことをしていたのですが、需要少しはあるかなーと記事にしてみた。

普通にフィボナッチ

irb(main):001:0> def fib n
irb(main):002:1>   n <= 1 ? n : fib(n-2) + fib(n-1)
irb(main):003:1> end
=> nil
irb(main):006:0* fib 10
=> 55
irb(main):007:0> require 'benchmark'
=> true
irb(main):011:0> Benchmark.measure { fib 40 }
=> #<Benchmark::Tms:0x007f84932ef3c8 @label="", @real=31.694596, @cstime=0.0, @cutime=0.0, @stime=0.04000000000000001, @utime=31.199999999999996, @total=31.239999999999995>

40とかすると遅いですね。

メモ化

irb(main):014:0* def fib_memo n
irb(main):015:1>   @memo ||= []
irb(main):016:1>   @memo[n] ||= n <= 1 ? n : fib_memo(n-2) + fib_memo(n-1)
irb(main):017:1> end
irb(main):020:0> Benchmark.measure { fib_memo 40 }
=> #<Benchmark::Tms:0x007f8493305858 @label="", @real=3.5e-05, @cstime=0.0, @cutime=0.0, @stime=0.0, @utime=0.0, @total=0.0>

メモ化、サラマンダーよりはや〜(ry 1000でも1瞬で終わります。

さって仕事しよう。