フィボナッチ数列の新しい項は直前の二つの項の和を求めることで生成される。 1および2から開始した最初の10項は1,2,3,5,8,13,21,34,55,89, …となる。
4000000以下のフィボナッチ数列のうち、全ての偶数の項の和をもとめよ。
フィボナッチ数列というのがまたHaskellの利点を最大限にアピールできるよう な問題のひとつである。これは頻出なのでGoogle先生が教えてくれると思うが、 Haskellでは必要になるまで式を評価しないので無限の数列を非常に簡単に表せ る。よくあるフィボナッチ数列の定義はこんな感じ。
fib = 1 : 1 : zipWith (+) fib (tail fib)
takeWhileはリストを前から順番に調べていって、条件が成立しつづけていると ころまで取り出す関数である。これで無限に続くフィボナッチ数列のリストか ら4000000以下の部分を取り出すことが出来る。filterはリスト全体の中から条 件を満たしている要素だけを取り出したリストを作る関数である。これで偶数 (even)の部分を取り出すことが出来る。最後に関数sumを用いて全てのリストの 要素の和を求めると答えとなる。
euler002 = sum $ filter even $ takeWhile (<= 4000000) fib
