スタックを操作する再帰関数

再帰の往路で$A$の3、2、1が順に$C$へ移り、復路で1、2、3が$B$へ追加されるので、$B$は$[1,2,3,1,2,3]$となり、アです。 再帰呼出しで$A$から3、2、1をpopし、順に$C$へpushする。 最深部から戻る際に$C$から1、2、3をpopする。 それらを初期状態$[1,2,3]$の$B$へ順にpushする。 段階 A C B 初期状態 [1,2,3] [1,2,3] [1,2,3] 1回目の f:A→C に 3 [1,2] [1,2,3,3] [1,2,3] 2回目の f:A→C に 2 [1] [1,2,3,3,2] [1,2,3] 3回目の f:A→C に 1 [] [1,2,3,3,2,1] [1,2,3] 4回目の f:A が空なので何もしない [] [1,2,3,3,2,1] [1,2,3] 3回目に戻る:C→B に 1 [] [1,2,3,3,2] [1,2,3,1] 2回目に戻る:C→B に 2 [] [1,2,3,3] [1,2,3,1,2] 1回目に戻る:C→B に 3 [] [1,2,3] [1,2,3,1,2,3] 再帰呼出しの 前 の処理(A→C)は呼び出す順に、 後 の処理(C→B)は戻る順(逆順)に実行されます。C を通ることで順序が2回反転し、B には元の順の 1, 2, 3 が積まれます。

三つのスタックAA,BB,CCのいずれの初期状態も[1,2,3][1,2,3]であるとき,再帰的に定義された関数f()f()を呼び出して終了した後のBBの状態はどれか。ここで,スタックが[a1,a2,⋯ ,an−1][a_1,a_2,\cdots,a_{n-1}]の状態のときにana_nをpushした後のスタックの状態は[a1,a2,⋯ ,an−1,an][a_1,a_2,\cdots,a_{n-1},a_n]で表す。

f(){
 Aが空ならば{
  何もしない。
 }
 そうでない場合{
  Aからpopした値をCにpushする。
  f()を呼び出す。
  Cからpopした値をBにpushする。
 }
}
出典平成31年度 春期 基本情報技術者試験 午前 問6
ア
[1,2,3,1,2,3][1,2,3,1,2,3]
イ
[1,2,3,3,2,1][1,2,3,3,2,1]
ウ
[3,2,1,1,2,3][3,2,1,1,2,3]
エ
[3,2,1,3,2,1][3,2,1,3,2,1]