JavaScript に変換できる言語で作業しています。一部のスタック オーバーフローを回避するために、特定の関数を for ループに変換してテール コールの最適化を適用しています。驚くべきことは、変換が再帰バージョンよりも速くないことです。
http://jsperf.com/sldjf-lajf-lkajf-lkfadsj-f/5
再帰バージョン:
(function recur(a0,s0){
return a0==0 ? s0 : recur(a0-1, a0+s0)
})(10000,0)
テール コールの最適化後:
ret3 = void 0;
a1 = 10000;
s2 = 0;
(function(){
while (!ret3) {
a1 == 0
? ret3 = s2
: (a1_tmp$ = a1 - 1 ,
s2_tmp$ = a1 + s2,
a1 = a1_tmp$,
s2 = s2_tmp$);
}
})();
ret3;
Google Closure Compiler を使用してクリーンアップした後:
ret3 = 0;
a1 = 1E4;
for(s2 = 0; ret3 == 0;)
0 == a1
? ret3 = s2
: (a1_tmp$ = a1 - 1 ,
s2_tmp$ = a1 + s2,
a1 = a1_tmp$,
s2 = s2_tmp$);
c=ret3;
再帰的なバージョンは、「最適化された」バージョンよりも高速です! 再帰バージョンが何千ものコンテキスト変更を処理する必要がある場合、これはどのように可能になるのでしょうか?