問題 No.2390
再帰呼び出しにおいて、コンパイラやインタプリタが末尾再帰最適化を行うことによって得られる主なメリットとして、適切なものはどれか。
【正解の解説】
新たなスタックフレームを追加せずに既存のフレームを再利用することで、スタック領域の消費を抑えられる。
レストランで次々に新しいお皿を使うのではなく、食べた後に同じお皿を綺麗に拭いて使い回すようなものです。これにより、何枚も食器を重ねる必要がなくなり、限られたキッチンのスペース(スタック領域)を無限に節約できるようになります。
スポンサーリンク
【その他の選択肢の解説】
関数呼び出しのたびに新しいスタックフレームを動的に生成し、処理終了後に一括して解放することで、メモリ管理を効率化できる。
これは末尾再帰最適化の逆の動作であり、通常の再帰呼び出しでメモリが枯渇する原因そのものです。新しいフレームを作り続けるため、深い再帰ではスタックオーバーフローを引き起こしてしまいます。
戻り番地をヒープ領域に退避させてから新しいスタックフレームを割り当てることで、深さ制限のある再帰処理を安全に実行できる。
ヒープ領域へ戻り番地を退避するような仕組みは、一般的なコンパイラの末尾再帰最適化では行われません。スタックの節約ではなく別のメモリ管理手法を想像させて誤答を誘う出題者の罠です。
ループ構造への自動的な書き換えを行わずにそのまま実行速度を向上させることで、プログラムの可読性を保ったまま処理を高速化できる。
実際の末尾再帰最適化の内部では、コンパイラが自動的にジャンプ命令を使ったループ構造へと書き換えることで高速化と省メモリを実現しています。「書き換えを行わない」という点が事実と異なります。