Delphi : 末尾再帰
まず、普通の再帰
function Sum(N, Accum: Integer): Integer; begin if N = 0 then Result := Accum else Result := Sum(N-1, Accum+N); end;
さて、末尾再帰の最適化については、
http://hp.vector.co.jp/authors/VA028375/delphi/delphipascal_xx_tail.html
で実験しておられますが、人間コンパイラを許すなら、こう書くのが一番シンプル。
function Sum(N, Accum: Integer): Integer; label start; begin start: if N = 0 then Result := Accum else begin N := N-1; Accum := Accum+N; goto start; end; end;
で、これを、もうちょっと書き方を変えられないかと考えているのだけれど・・・
こんなので上手くいくかと思ったのだけれど、ダメ。関数の頭で、最適化のため、パラメータが退避させられてしまった。
function Sum(N, Accum: Integer): Integer; function _Sum_(N, Accum: Integer): Integer; asm end; label start; begin start: if N = 0 then Result := Accum else begin _Sum_(N-1, Accum+N); goto start; end; end;
でもって、考え中。