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

へっへー♪