Problem 2
http://projecteuler.net/index.php?section=problems&id=2
フィボナッチ数列の項は前の2つの項の和である。
最初の2項を 1, 2 とすれば、最初の10項は以下の通りである。
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
数列の項の値が400万を超えない範囲で、偶数値の項の総和を求めよ。
Note:この問題は最近更新されました。お使いのパラメータが正しいかどうか確認してください。
特に難しくもないわけですが、
- Object#method 使えば組込みクラスのクラスメソッドのエイリアス作れるなあ
- inject の別名で reduce ができてた
- Float::INFINITY で無限を扱える
- break にブロックの戻り値を書ける
あたりをわかってなかった。
class Integer def Integer.fibonacci(x) @@lst||=[1,2] (@@lst[x]=(@@lst[x-2]||=(x-2).fibonacci)+(@@lst[x-1]||=(x-1).fibonacci)) end end fibonacci=Integer.method(:fibonacci) p (2..Float::INFINITY).reduce(0){|r,i| break r if fibonacci(i)>4000000 fibonacci(i).even? ? (r+fibonacci(i)) : r }