この問題は、スタック(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]となるはずです。
読み込み中...