【質問】基本情報技術者平成31年春期 午前問6

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
あいさん  
(No.1)
基本情報技術者平成31年春期 午前問6について質問があります。
(データ)
A[1,2,3]  B[1,2,3]  C[1,2,3]

f(){
  Aが空ならば{
    何もしない。
  }
  そうでない場合{
    Aからpopした値をCにpushする。
    f()を呼び出す。
    Cからpopした値をBにpushする。
  }
}

このソースの実行手順なのですが
①Aが空ではないのでAからpopした「3」値をCにpushする。
A[1,2]  B[1,2,3]  C[1,2,3,3]
②f()が呼び出される。
③Aが空ではないのでAからpopした「2」値をCにpushする。
A[1]  B[1,2,3]  C[1,2,3,3,2]
④f()が呼び出される。
⑤Aが空ではないのでAからpopした「1」値をCにpushする。
A[]  B[1,2,3]  C[1,2,3,3,2,1]
⑥f()が呼び出される。
⑦Aが空なので処理は何もしない。

このソースの内容だと⑦のまま状態が変異しないので、永久にループしそうなのですが……
以下の解説文のようになる理由がわからないので教えてください。

〔f() 呼び出し3回目の続き〕
Cからpopした"1"をBにpushする。
A[]  B[1,2,3,1]  C[1,2,3,3,2]
//f() 3回目終了

〔f() 呼び出し2回目の続き〕
Cからpopした"2"をBにpushする。
A[]  B[1,2,3,1,2]  C[1,2,3,3]
//f() 2回目終了

〔f() 呼び出し1回目の続き〕
Cからpopした"3"をBにpushする。
A[]  B[1,2,3,1,2,3]  C[1,2,3]
//f() 1回目終了

<プログラム終了>
2019.06.18 16:17
ああああさん 
(No.2)
あくまでf()は呼び出されただけであり、f()の処理が終わったら、呼び出し元の関数の処理は継続します。
具体的な順序を見てみましょう。
このコードは三階層の入れ子になっているので、階層毎にインデントを入れて表現してみると以下のようになります。


①Aが空ではないのでAからpopした「3」値をCにpushする。
A[1,2]  B[1,2,3]  C[1,2,3,3]

②f()が呼び出される。

    ③Aからpopした2をCにpushする。
      A[1]  B[1,2,3]  C[1,2,3,3,2]

    ④f()が呼び出される。

        ⑤Aからpopした1をCにpushする。
           A[]  B[1,2,3]  C[1,2,3,3,2,1]

        ⑥f()が呼び出される。

              ⑦Aが空なので処理はしない。

        ⑧Cからpopした1をBにpushする。
          A[]  B[1,2,3,1]  C[1,2,3,3,2]

    ⑨Cからpopした2をBにpushする。
      A[]  B[1,2,3,1,2]  C[1,2,3,3]

⑩Cからpopした3をBにpushする。
      A[]  B[1,2,3,1,2,3]  C[1,2,3]
2019.06.18 20:05
あいさん  
(No.3)
>ああああ様
なるほど……ようやくわかりました。
ありがとうございます。
2019.06.19 09:07

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop