Erlangが末尾再帰最適化をしてるか調べようとした

30分プログラム、その547。Erlangが末尾再帰最適化をしてるか調べようとして、挫折した。

fact(0) ->
    1;
fact(N) ->
    N * fact(N-1).

という由緒正しい再帰のコードが、全然スタックオーバーフローしないんだもん。fact(65536)にも耐えるとは・・・。
というわけで、Erlangなら末尾再帰にもこだわらなくてもいい、という結論になりました。あれ?

使い方

fact(N)がどこまで耐えれるかを調べる関数を書いたので、それの使い方を。結局、途中で打ち切ったけど。

1> tailrec:heavy(2).
N=2
N=4
N=8
N=16
N=32
N=64
N=128
N=256
N=512
N=1024
N=2048
N=4096
N=8192
N=16384
N=32768
N=65536
N=131072

ソースコード

-module(tailrec).
-compile([export_all]).

fact(0) ->
    1;
fact(N) ->
    N * fact(N-1).

heavy(N) ->
    io:format("N=~p~n",[N]),
    fact(N),
    heavy(N*2).