1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
-module(collatz_kakutani).
-export([main/0]).

step(1, Step) -> Step;
step(Num, Step) ->
        case Num rem 2 of
                0 -> step(Num div 2, Step + 1);
                1 -> step(3 * Num + 1, Step + 1)
        end.

max_step(1, MaxNum, MaxStep) -> [MaxNum, MaxStep];
max_step(Num, MaxNum, MaxStep) ->
        TmpStep = step(Num, 0),
        if
                TmpStep > MaxStep -> max_step(Num - 1, Num, TmpStep);
                true              -> max_step(Num - 1, MaxNum, MaxStep)
        end.

main() -> io:format("f(~B) = ~B~n", max_step(1 bsl 20, 1, 1)).