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