open Int64 fun collatz n = let fun f (1, i) = i | f (n', i) = if n' mod 2 = 0 then f (n' div 2, i + 1) else f (n' * 3 + 1, i + 1) fun loop 0 max = max | loop n max = let val r = if n mod 2 = 0 then f (n div 2, 1) else f (n * 3 + 1, 1) in loop (n - 1) (if #2 max > r then max else (n, r)) end in loop n (n, 0) end val (n, step) = (collatz o fromLarge o IntInf.pow) (2, 20) val _ = print ("f(" ^ toString n ^ ") = " ^ toString step ^ "\n")