info

Rubyのメモ化をメタプログラミングを使わずにやる

一度は諦めたこの方法でできた

def memoize(f)
  dp =  {}
  lambda {|*arg| dp[arg] ||  dp[arg] = f.call(*arg)}
end

def ack(m, n)
  if m == 0 then
    n + 1
  elsif n == 0 then
    ack(m - 1, 1)
  else
    ack(m - 1, ack(m, n - 1))
  end
end

ack = memoize(lambda{|*arg| ack(*arg)})

ack.call(3, 9)
=> 4093

lambdaで包めばよいのだ!