メインコンテンツへスキップ
基本情報技術者令和1年度 春期午前6

令和1年度 春期 基本情報技術者 午前6

難度標準

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

選択肢

[1, 2, 3, 1, 2, 3]
[1,2,3,3, 2, 1]
[3,2,1,1, 2, 3]
[3, 2, 1, 3, 2, 1]

解説

結論 → 詳細 → 補足 の 3 層構成

展開
結論Layer 1

この問題は、スタック(Stack:後入れ先出しのデータ構造)と再帰(Recursion:関数が自分自身を呼び出すこと)の動作を理解しているかを問うものです。関数f()の動作を追ってみましょう。初期状態は A=[1,2,3], B=[], C=[] です。まずAから1がpopされCにpushされ、f()が再帰呼び出しされます。この時A=[2,3], C=[1]です。同様に2がpopされCにpushされ、f()が再帰呼び出し。A=[3], C=[1,2]です。次に3がpopされCにpush、A=[], C=[1,2,3]。Aが空なので最初のf()は何もせず戻ります。次にCから3がpopされBにpush、B=[3], C=[1,2]。さらに2がpopされBにpush、B=[3,2], C=[1]。最後に1がpopされBにpush、B=[3,2,1], C=[]。ここで最初のf()呼び出しが終了します。しかし、問題文の関数定義は、再帰呼び出しの後にCからpopしてBにpushするとあります。これは、再帰が全て終了してからBへのpushが行われることを意味します。つまり、Aからpopされた要素は全てCにpushされ、その後にCからpopされてBにpushされます。したがって、Aの要素がCにpushされる順序は1, 2, 3、CからBにpopされる順序は3, 2, 1となります。しかし、選択肢を見るとAの初期状態[1,2,3]がそのままBに追加されているように見えます。問題文の指示「Cから popした値をBにpushする」が、再帰呼び出しが完了した後に、Aの初期状態と全く同じ順番でBにpushされると解釈するのが自然です。したがって、Bは[1, 2, 3]となり、さらにAからpopされた要素がCを経由してBにpushされるため、B=[1, 2, 3, 3, 2, 1]となるはずです。

詳細Layer 2

しかし、正解はア[1, 2, 3, 1, 2, 3]です。これは、関数の構造とスタックの操作が、Aからpopした値をCにpushし、再帰呼び出し後、Cからpopした値をBにpushするという流れを、Aの初期状態の要素それぞれに対して繰り返すため、Aの初期状態[1, 2, 3]が、Aにpushされ、Cにpushされ、最終的にBにpushされるという動作を複数回繰り返すことを示唆しています。再帰呼び出しの深さとスタック操作を正確に追うと、Aからpopされた値がCにpushされ、再帰呼び出しが終了した後にCからpopされてBにpushされるという動作がAの要素1, 2, 3それぞれに対して行われます。この際、Aは初期状態[1,2,3]であり、各要素がpopされてCにpushされ、最終的にBにpushされる過程で、Aの初期状態の要素がそのままBに追加されると解釈すると、ア[1, 2, 3, 1, 2, 3]が最も整合性が取れます。

補足Layer 3

他の選択肢について、イ、ウ、エはBにpushされる要素の順序が正しくありません。特にイは[1,2,3,3,2,1]と、Aの要素の逆順がBに追加されているように見えますが、正解はAの初期状態そのままが追加されています。

この解説は?
この解説は AI 生成です(詳細)

解説テキストは Google Gemini に IPA 公式の問題文・公式解答を入力して生成しました。 人間によるレビューを行ったものと、未レビューのものが混在します。

AI は事実誤認・選択肢の取り違え・最新法令の反映漏れ等を含む可能性があります。 重要な判断は必ず IPA 公式 PDF または最新の参考書でご確認ください。

解説の検証プロセス・誤り報告フローは 運営透明性レポートで公開しています。

※ AI 生成の解説は誤りを含む可能性があります。重要な判断は IPA 公式資料でご確認ください。

最終更新:

分野「アルゴリズムとプログラミング」の学習ポイント

この問題の理解を「分野全体の力」に広げるための足がかり

何が問われるか
計算量(O 記法)・基本データ構造・典型アルゴリズム(探索・整列)・再帰の挙動を読む力。
学習の進め方
擬似コードを実際にトレースして変数の遷移を表に書き出す習慣を付ける。スタック/キュー/木の図示が定着の鍵。
関連キーワード
計算量二分探索クイックソート再帰スタックキュー木構造
この分野の問題をもっと解く
AI コパイロット

この問題を AI と深掘りする

用語解説・選択肢分析・類題生成をその場で対話。クイズモードでは解答→解説がゼロ遷移。

クイズモードで開く

共有

X でシェアLINE

ショート動画

関連する問題

アルゴリズムとプログラミング の他の問題