Problem 14

http://projecteuler.net/index.php?section=problems&id=14

--Haskell (needs -fbang-patterns -package containers), 20090101

import Data.Map (findMax, fromList)

collatz :: Integer -> Integer
collatz !n | n==1      = 1
           | even n    = 1 + collatz (n`div`2)
           | otherwise = 2 + collatz ((n*3+1)`div`2)

main = print $ snd $ findMax $ fromList [(collatz (toInteger x), x) | x<-[1..999999]]

bang patternsを使わなければ,空間効率が悪すぎて終わらない.枝を刈ればもう少し速くなるだろう.