LoginSignup
4
4

More than 5 years have passed since last update.

Rubyで無名再帰(Zコンビネータ)

Last updated at Posted at 2012-05-04

無名再帰を使ってフィボナッチ数の計算をしてみた。
イマイチ理屈はわかってないけど…

z-combinator.rb
# Zコンビネータ
def Z(func)
  lambda do |f|
    lambda{|x|lambda{|y| f[x[x]] [y]}}[
      lambda{|x|lambda{|y| f[x[x]] [y]}}]
  end[func]
# .callメソッドで書くとこう
#  lambda do |f|
#    lambda{|x|lambda{|y| f.call(x.call(x)).call(y)}}.call(
#      lambda{|x|lambda{|y| f.call(x.call(x)).call(y)}})
#  end.call(func)
end

# フィボナッチ数
fib = Z(lambda{|f|lambda{|n| n < 2 ? n : f[n - 2] + f[n - 1]}})
p fib.call(7) # 1, 1, 2, 3, 5, 8, 13, ...

とりあえず今はおまじない的に覚えておこうと記録

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4