29 lines
990 B
Haskell
29 lines
990 B
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.
|
|
{-# LANGUAGE BangPatterns #-}
|
|
module Main (main) where
|
|
import Data.Function
|
|
import Data.List
|
|
|
|
collatz n = if even n then n `div` 2 else 3*n + 1
|
|
|
|
collatzLength n = go n 1
|
|
where go 1 !t = t
|
|
go n !t = go (collatz n) (t + 1)
|
|
|
|
main = print $ fst $ maximumBy (compare `on` snd) $ map (\n -> (n, collatzLength n)) [1..999999]
|