CPS形式への変換による末尾最適化 通常,Cなどの言語では再帰呼び出しの回数が多すぎるとstackのオーバーフローを起こす. なぜなら,関数呼び出しの度にstackに積まれる情報は,関数が戻り値を持って制御を呼び出し元に返すときまで解放されないからだ. 同様の事は深い関数呼び出しでも起こる. schemeはその仕様上,再帰によってループを表現するのだが, ループの回数が増える事は再帰呼び出しの深さが増していくのと等価になるため, ループ呼び出し回数がstackの大きさによって左右される事になる. そのために,Schemeでは末尾再帰の最適化が行われる. 以下のような式は適切に最適化されること仕様としてR5RSに盛り込まれている事は良く知られている. (define fact (lambda (n a) (define fact-iter (lambda (n a) (if (