読者です 読者をやめる 読者になる 読者になる

Ruby でメタプログラミング的にフィボナッチ数列を求める

Rubyフィボナッチ数列を求めるメタプログラミングを書いてみた。

class Fib
    def call n
        __send__ "_#{n}"
    end

    def method_missing name, *args
        n = name[/_(\d+)/, 1].to_i
        if n > 1
            n = call(n - 2) + call(n - 1)
        end
        define_singleton_method(name) { n } && n
    end
end


fib = Fib.new
1.upto(55) do |n|
    print "#{fib.call n} "
end
# => 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 2971215073 4807526976 7778742049 12586269025 20365011074 32951280099 53316291173 86267571272 139583862445

各項をそのままメソッドとして定義することでメモ化しています。
Ruby だとこういう面白いコードがかけるのがいいですね。