Io で Collatz 予想

お題は「Collatz予想」についての問題です.
関数型言語でも,そうでない言語でも,ぜひ回答をお寄せください!


キミならどう書く 2.0 - ROUND 2 - ? Lightweight Language Ring


例によって、Io(iolanguage) で書くとこんな感じに。

collatz.io

result := 0
max_step := 0

collatz := Object clone do(
    step := 0
    f := method(n,
        step = step + 1
        if (n == 1, 1,
            if (n % 2 == 0, f(n / 2), f(3 * n + 1))
        )
    )
    calc := method(n,
        step = 0
        f(n)
    )
)

for(i, 1, 100,
    collatz calc(i)
    if (max_step < collatz step,
        max_step = collatz step
        result = i
    )
)

write("result = ", result, "\n")
write("max_step = ", max_step, "\n")


実行結果

$ io collatz.txt
result = 97
max_step = 119


collatz オブジェクトは、calc で計算開始、呼び出し回数は step にカウントされていきますー