aliasとメモ化
お皿を洗っているときに「aliasで元のメソッドを保存しておくこととメモ化は相性が良い」と気づいたので、さっそくコーディングしてみました。まずは関数的に実装します。
def fib(n) print "." if n <= 1 1 else fib(n - 1) + fib(n - 2) end end def fib_test(n) (0..n).each do |i| puts fib(i) end end puts "Original:" fib_test(8) alias :original_fib :fib $mem = Array.new def fib(n) if $mem[n] $mem[n] else $mem[n] = original_fib(n) end end puts "Memoir:" fib_test(8)
実行結果です。元のfibメソッドを呼ぶたびにピリオドを表示しています。
Original: .1 .1 ...2 .....3 .........5 ...............8 .........................13 .........................................21 ...................................................................34 Memoir: .1 .1 .2 .3 .5 .8 .13 .21 .34
へっへー♪