30 lines
1.0 KiB
Haskell

-- The following iterative sequence is defined for the set of positive integers:
--
-- n → n/2 (n is even)
-- n → 3n + 1 (n is odd)
--
-- Using the rule above and starting with 13, we generate the following sequence:
--
-- 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
--
-- It can be seen that this sequence (starting at 13 and finishing at 1) contains 10 terms. Although it has not been proved yet (Collatz Problem),
-- it is thought that all starting numbers finish at 1.
--
-- Which starting number, under one million, produces the longest chain?
--
-- NOTE: Once the chain starts the terms are allowed to go above one million.
collatz :: (Integral a) => a -> [a]
collatz 1 = [1]
collatz n
| even n = n:(collatz $ n `div` 2)
| odd n = n:(collatz $ 3 * n + 1)
maxCollatzLength :: Int -> Int
maxCollatzLength n = snd $ maximum $ zip [ length (collatz x) | x <- [1..n-1] ] [1..n-1]
main = do
let result = maxCollatzLength 1000000
putStrLn $ "Project Euler, Problem 14\n"
++ "Answer: " ++ (show result)