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))