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).