Life Goes On

まあまあだけど楽しんでる方です

2問目

フィボナッチ数列に含まれる4000000以下の偶数を足し合わせろという問題。
http://projecteuler.net/index.php?section=problems&id=2

main = print $ euler002 1 2 0

euler002 :: Int -> Int -> Int -> Int
euler002 a b s
    | (b > 4000000) = s
    | (mod b 2 == 0) = euler002 b (a+b) (s+b)
    | otherwise = euler002 b (a+b) s

最初に書いたプログラムがあまりHaskellっぽくないので、書き直しました。
と思ったら、遅い…。もう少し工夫しないと駄目みたいです。
fibの定義が拙そうなんだけど。

main = print $ euler002 4000000

euler002 :: Int -> Int
euler002 limit = sum $ filter even $ takeWhile (< limit) $ map fib [1..]

fib :: Int -> Int
fib 1 = 1
fib 2 = 1
fib n = fib (n - 1) + fib (n - 2)

追々記。他の人のコードを見たら、いいのがありました。
まだまだこういうのは書けないなぁ。

main = print $ euler002 4000000

euler002 :: Int -> Int
euler002 limit = sum $ filter even $ takeWhile (< limit) fibs

fibs :: [Int]
fibs = 1:2:(zipWith (+) fibs (tail fibs))