スポンサーリンク

問題の解答・解説ページ

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

この問題をクイズ形式で解く
問題 No.1919
自然数を引数にとり、自身を呼び出す関数を用いて総和を計算する再帰プログラムを実装した。この関数が正しく動作するために、各呼び出しにおいてスタックに保存されるデータとして適切なものはどれか。

【正解の解説】

戻り番地や仮引数などの処理の再開に必要な実行コンテキスト

料理のレシピ本を見ながら別の料理を作り、また元に戻るようなものです。再帰呼び出しでは、何段もネストして関数を呼び出すため、「今どこまで計算して、次はどこに戻るんだっけ?」というメモ書きをスタックという専用のボードに順番に積み上げていく必要があります。このメモ書きが実行コンテキストであり、これがあるからこそ関数が正しく元の場所へ帰って来られます。

スポンサーリンク

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

グローバル変数や静的領域に格納される共有データへの参照ポインタ

グローバル変数はプログラム全体からアクセスできるホワイトボードのようなものです。これを再帰呼び出しのたびにスタックに積むと、どの関数からでも値が書き換わってしまい、正しく計算ができなくなってしまいます。再帰では、あくまで自分だけのプライベートな変数や戻る場所を個別に管理する必要があるため、この選択肢は誤りとなります。

計算結果を効率的に再利用するためのメモ化テーブル上のインデックス

同じ計算を何度も繰り返さないように答えをノートに控えておく「メモ化」の仕組みです。計算結果の再利用には非常に便利ですが、関数が呼び出されるたびに自動でスタックに積まれる実行時のデータそのものではありません。スタックはあくまでプログラムの実行順序や引数を管理するためのものであるため、この選択肢は不適切です。

ヒープ領域に動的に割り当てられて永続的に保持されるオブジェクトのインスタンス

ヒープ領域は、インスタンスのように長生きさせたい大きなデータを置いておく「倉庫」のような場所です。一方、再帰呼び出しで使われるスタックは、関数が終わればすぐに消える「机の上のメモ用紙」のような一時的な空間です。用途と保存される場所が根本的に異なるため、初学者が混同しやすいポイントとしてよく出題される典型的なひっかけです。