スポンサーリンク

問題の解答・解説ページ

このページは解説の閲覧モードです。
実力試しをしたい方は、下のボタンからクイズに挑戦してください!

この問題をクイズ形式で解く
問題 No.2398
あるプログラマが、再帰呼び出しを用いた関数で階乗を計算するプログラムを作成したが、実行時に終了条件の指定を誤ったために関数が際限なく自分自身を呼び出し続け、最終的にプログラムが異常終了した。この現象を引き起こした根本的な原因として、適切なものはどれか。

【正解の解説】

関数が自分自身を呼び出すたびにスタック領域に新しいフレームが順次蓄積され、利用可能なメモリ容量が枯渇したこと

再帰呼び出しで終了条件を書き忘れると、無限にマトリョーシカを開け続けるような状態で、机の上のメモ帳が無限に積み上がって最終的に机の上が埋め尽くされ身動きが取れなくなるのと同じように、メモリ内の「コールスタック」という一時的な作業スペースが限界を超えて溢れ返ってしまい、プログラムが強制終了してしまいます。

スポンサーリンク

【その他の選択肢の解説】

関数が自分自身を呼び出すたびにヒープ領域に新しいオブジェクトが順次生成され、利用可能なメモリ容量が枯渇したこと

ヒープ領域は主に「new」などを使ってプログラマが意図的に巨大なデータやオブジェクトを生成する場所です。再帰呼び出しの無限ループで起きるエラーは、関数の戻り番地やローカル変数が積まれる「スタック領域」のオーバーフローであるため、ヒープ領域との違いを混同しないよう注意が必要です。

関数が自分自身を呼び出すたびにレジスタの値が上書きされ続け、CPUの演算処理能力が完全に飽和してしまったこと

CPUのレジスタは非常に高速な一時記憶装置ですが、再帰の無限ループによってCPU自体の性能が限界を迎えるというよりも、関数を呼び出すたびに消費されるメモリ空間が無限に膨らむことで、OSからメモリ割り当てを拒否されて異常終了するのが一般的なメカニズムです。

関数が自分自身を呼び出すたびにファイルディスクリプタが新規オープンされ、OSの同時接続数が限界に達したこと

ファイルディスクリプタはファイルやネットワークの通信口をOSが管理するための番号です。Webサーバー等でアクセス過多の際によく問題になる現象ですが、純粋なプログラム内部の関数による再帰呼び出しの暴走とは仕組みが全く異なるため、出題者の罠として仕掛けられた誤答選択肢です。