コラッツ問題

最近授業でprologを扱っていて、コラッツ数列を求める、末尾再帰なコードを書くという問題が出た。

未だに末尾再帰があんまりよくわかってないんだけど、「再帰呼び出しが各手続きでの最後にある」ように書けばいいんだそうだとか。ということで以下のように書いた。

collatz(1).
collatz(N) :- A is N mod 2, A == 0, B is N / 2, write(B), write(','), collatz(B)
    C is N * 3, D is C + 1, write(D), write(','), collatz(D).

コラッツ問題は末尾再帰で書きやすい。