修了試験 2021-07-25実施分 基本情報技術者試験 問8
三つのスタック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する。 } }
正答1
解説
正解は1です。 スタックは最後に入れた値を最初に取り出す後入れ先出し(LIFO)の構造です。 関数f()は自分自身を呼び出す再帰関数で、Aが空になるまで呼び出しが深くなります。 呼び出しから戻るときに、Cから取り出した値をBに積む流れをたどります。 【計算】 初期状態はA=[1, 2, 3]、B=[1, 2, 3]、C=[1, 2, 3]で、右端が先頭(最後に入れた値)です。 1回目のf():Aから3を取り出し、Cに積みます。 Cは[1, 2, 3, 3]になります。 2回目のf():Aから2を取り出し、Cは[1, 2, 3, 3, 2]になります。 3回目のf():Aから1を取り出し、Cは[1, 2, 3, 3, 2, 1]になります。 4回目のf():Aが空なので何もせず戻ります。 3回目に戻り、Cから1を取り出してBに積みます。 Bは[1, 2, 3, 1]になります。 2回目に戻り、Cから2を取り出し、Bは[1, 2, 3, 1, 2]になります。 1回目に戻り、Cから3を取り出し、Bは[1, 2, 3, 1, 2, 3]になります。 【選択肢別解説】 1:○ 上のとおり、Bには元の1、2、3の後ろに1、2、3の順で値が積まれます。 2:× [1, 2, 3, 3, 2, 1]は、Aから取り出した順(3、2、1)でそのままBに積んだ場合の状態です。 実際にはCを経由するので順序が逆になります。 3:× Bの初期状態の[1, 2, 3]は変更されないので、先頭が3、2、1になることはありません。 4:× 3と同じく、Bの初期部分が[3, 2, 1]になることはありません。 【ポイント】 スタックを2回経由すると、取り出し順が2回反転して元の順序に戻ります。 ここではAからCへ、CからBへと移すので、Bには元のAと同じ1、2、3の順に積まれます。まとめて解く
修了試験 2021-07-25実施分を通しで解く(80問)→