Project Euler Problem 14
http://projecteuler.net/index.php?section=problems&id=14
100万未満の数字で、その数字から始まるコラッツ数列が最長になる数。
main = print $ euler14 999999 euler14 :: Integer -> Integer euler14 n = toInteger $ (+1) $ length $ takeWhile (< (maximum euler14')) euler14' where euler14' = map collatzSequenceLength [1..n] collatzSequenceLength :: Integer -> Integer collatzSequenceLength n | n == 1 = 1 | odd n = 1 + (collatzSequenceLength (3*n + 1)) | otherwise = 1 + (collatzSequenceLength (n `div` 2))
ふつうに実行するとオーバーフロー
$ ghc -W -o euler14 euler14.hs $ ./euler14 Stack space overflow: current size 8388608 bytes. Use `+RTS -Ksize' to increase it.
オプション指定して、一応できたが10分近くかかるw
$ date;./euler14 +RTS -K100M;date 2009年 6月11日 木曜日 01時20分40秒 JST 837799 2009年 6月11日 木曜日 01時30分12秒 JST
Problem 14 - Haskellはスケるよによると同じ数列が頻出するのでメモ化すればいいらしいが
Haskellレベル1の俺には解法は見当もつかないなぁ。
(2009/06/29 追記)
コメントで教えて頂いた最適化オプションを試してみたらかなり短縮できました(しかもオーバーフローしない)。
$ ghc -W -O2 -o euler14 euler14.hs $ date;./euler14;date 2009年 6月29日 月曜日 09時45分32秒 JST 837799 2009年 6月29日 月曜日 09時45分43秒 JST