フィボナッチ数列、今日も

いえ、何か新機軸があるわけではありません。

def fib_gen()
  a, b = 1, 1
  while yield(a)
    a, b = b, a + b
  end
end

fib_gen() do |x|
  print x, " "
  x < 5000
end
#=> 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765

単に練習しているだけです。

class Fib
  def initialize
    @a, @b = 0, 1
  end
  def next
    @a, @b = @b, @a + @b
    @a
  end
end

fib = Fib.new
20.times {
  print fib.next(), " "
}

#=> 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765

これはちょっとおもしろいかな。

def fib(a, b)
  lambda { return b, fib(b, a + b); }
end

f = fib(0, 1)

20.times do
  x, f = f.call()
  print x, " "
end

#=> 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765

単に複雑にしているだけのような気もする。

def fib(a, b, &block)
  lambda { return b, fib(b, block.call(a, b), &block); }
end

f = fib(0, 1) {|a, b| a + b }

20.times do
  x, f = f.call()
  print x, " "
end
#=> 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765

以前、似たようなものをどこかで見たような感じがするが、思い出せない。

fib = lambda {|f, a, b|
  lambda { return b, f.call(f, a + b, a) }
}

f = fib.call(fib, 1, 1)

20.times do
  x, f = f.call()
  print x, " "
end
#=> 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765

何がなにやら。

h = lambda {|g, a, b| lambda { print b, " "; g.call(g, a + b, a) }}
f = h.call(h, 1, 1)
20.times do
  f = f.call()
end
#=> 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765

単に練習しているだけだからいいんですってば。

h = lambda {|g, r, a, b, q| lambda { r << b; q.call(r); g.call(g, r, a + b, a, q) }}
q = lambda {|r| p r}
f = h.call(h, [], 1, 1, q)
20.times do
  f = f.call()
end
__END__
[1]
[1, 1]
[1, 1, 2]
[1, 1, 2, 3]
[1, 1, 2, 3, 5]
[1, 1, 2, 3, 5, 8]
[1, 1, 2, 3, 5, 8, 13]
[1, 1, 2, 3, 5, 8, 13, 21]
[1, 1, 2, 3, 5, 8, 13, 21, 34]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]