IPA過去問ドリル

平成31年度 春期 基本情報技術者試験 午前 問6

テクノロジ/アルゴリズム

三つのスタックA,B,Cのいずれの初期状態も[1,2,3]であるとき,再帰的に定義された関数f( )を呼び出して終了した後のBの状態はどれか。ここで,スタックが[a1,a2,…,an-1]の状態のときanをpushした後のスタックの状態は[a1,a2,…,an-1,an]で表す。 f(){ Aが空ならば{ 何もしない。 } そうでない場合{ Aからpopした値をCにpushする。 f()を呼び出す。 Cからpopした値をBにpushする。 } }

出典:平成31年度 春期 基本情報技術者試験 午前 問6

正解:ア

解説

f()はAが空になるまで再帰呼び出しを繰り返し,その過程でAの要素(3,2,1の順)をすべてCへ移します。再帰から戻る際に,各呼び出しの最後でCの一番上の値をBへpushするので,戻る順序(内側の呼出しから先に戻る)によりCから1,2,3の順でBへ積まれます。その結果,Bは元の[1,2,3]の上に,同じ並びの[1,2,3]が積み増しされた形になります。

選択肢ごとの解説

  • 正しい。Aの中身を一旦Cへ移し,再帰から戻りながらCからBへ移すことで,Bには元の[1,2,3]の上に同じ並びの[1,2,3]が積み増しされます。
  • 誤り。[1,2,3,3,2,1]はAの要素を移した順のまま逆転させずにBへ積んだ誤りで,再帰から戻る順序を反映していません。
  • 誤り。[3,2,1,1,2,3]はBの初期状態の並びまで書き換えてしまった誤りで,Bの下側3要素は初期状態のまま変化しません。
  • 誤り。[3,2,1,3,2,1]はAとCの要素の移動順序を取り違えた誤りです。
基本情報技術者の過去問を演習モードで解く