一方、末尾再帰の場合、関数呼び出しから戻ってきてから行う操作は存在しません。 このため、関数呼び出しと自分自身の関数の戻り操作を同時に行ってしまうことが出来ます。 即ち、自分の実行にもちいていたフレームを放棄し、 その上に呼び出した関数のフレームを上書きすることで、スタックを積みあげることなしに 実行することができます。 自分自身への呼び出しであることを利用できると、 引数の更新並びに jump 文として実装を行うことも出来るわけです。
興味があれば、C 言語とそのアセンブリコードを見比べてみると良いかもしれません。
99.9.29/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp