
I tried to solve the same problem and came out with a O(log n) solution. It is pretty quick, since I keep track of the steps on a map structure. Even though it runs really fast, it hogs on memory just like Steve's version. Following is the full source, for your consideration: ======================Euler14.hs====================== import qualified Data.Map as Map import qualified Data.List as List type Table=Map.Map Integer Integer rank::Table->Integer->(Table,Integer) rank s n= (s',r) where nxt=if even n then (n `div` 2) else (3*n+1) r=case (Map.lookup n s) of Just a -> a Nothing-> (1 + (snd $ rank s nxt)) s'=Map.insert n r s search::Integer->Integer search n = case List.findIndex (\a -> a==ms) sw of Just a -> toInteger(a) +1 Nothing -> -1 where s=Map.singleton 1 1 sw=searchWork s [1..n] ms=maximum sw searchWork::Table->[Integer]->[Integer] searchWork s []=[] searchWork s (i:is)= r:(searchWork s' is) where (s',r)=rank s i main = do print $ search 1000000 ======================Euler14.hs======================