フィボナッチ数列、今日も
いえ、何か新機軸があるわけではありません。
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]