« Haskell で fibonacci | トップページ | Project euler : Problem 2 〜 フィボナッチ数 »

2009年12月 2日 (水)

Project Euler : Problem 1 ~ 今度は Haskell で

 先日まで、Project Euler を Scheme でやり直そうと思っていたんですが、Haskell の練習ということで、しばらくは Haskell でやり直していきます。ではさっそく第 1 問から……

 問題はこちらをご覧ください。

 問題自体は簡単なので、いろんな方法を考えてみました。

-- 補助関数によるループ main = print $ problem001 999 problem001 :: Integer -> Integer problem001 n = iter n 0 where iter m sum | m == 0 = sum | rem m 3 == 0 = iter (m - 1) (sum + m) | rem m 5 == 0 = iter (m - 1) (sum + m) | otherwise = iter (m - 1) sum

-- List によるループの抽象 main = print $ problem001 999 problem001 :: Integer -> Integer problem001 n = sum $ filter check [1 .. n] where check x = mod x 3 == 0 || mod x 5 == 0

-- リスト内包表記 main = print $ problem001 999 problem001 :: Integer -> Integer problem001 n = sum [x | x <- [1..n], (mod x 3 == 0 || mod x 5 == 0)]

-- 等差数列を利用 main = print $ problem001 999 problem001 n = sum1 + sum2 - sum3 where sum1 = sum [0, 3 .. n] sum2 = sum [0, 5 .. n] sum3 = sum [0, 15 .. n]

 最初は「なんだか、難しそうだなぁ……」と思っていましたが、実際にコードを書いてみると、(「純粋」とは言えないまでも)関数言語の仲間である Scheme と似た感覚でコードがかけたので、少しだけ苦手意識がなくなりました。
 Haskell と Scheme では lazy と eager という違いがあるので、まったく同じようにはいかないとは思いますが、Scheme で書いたコードを参考にすれば、少しは楽に Haskell のコードが書けるような気がします。

« Haskell で fibonacci | トップページ | Project euler : Problem 2 〜 フィボナッチ数 »

Haskell」カテゴリの記事

Project Euler」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/112020/46916747

この記事へのトラックバック一覧です: Project Euler : Problem 1 ~ 今度は Haskell で:

« Haskell で fibonacci | トップページ | Project euler : Problem 2 〜 フィボナッチ数 »

2016年7月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
フォト

最近のトラックバック

無料ブログはココログ