Project Euler - Problem 2
フィボナッチ数列の項は前の2つの項の和である。 最初の2項を 1, 2 とすれば、最初の10項は以下の通りである。 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... 数列の項が400万を超えない範囲で、偶数の項の総和を求めよ。
再帰使ったら(速度的に)負けだと思ってる。
末尾再帰の最適化とかなんとかLispでは聞くけど。
こうやると 400万までのフィボナッチ数列を配列でがばっと作らず、 Enumerator を lazy array のように使えている…はず。
def fibonacci(limit) return enum_for(__method__, limit) unless block_given? yield(a = 1) yield(b = 2) loop do break if (n = a + b) >= limit yield(n) a, b = b, n end end p fibonacci(4_000_000).inject(0){|r, i| r + (i.even? ? i : 0) } # => 4613732