基本情報技術者令和3年免除試験 問9

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
ゆうさん  
(No.1)
基本情報技術者令和3年免除試験 問9
  {
    nを印字する①
    proc(n-1)を呼び出す②
    nを印字する③
  }
  を実行して戻る④

答えが543211になるまで理解できたのですが、なぜ次に2345になるのかがわかりません。
①で印字し②を毎回繰り返している考えだったので、③④の処理がいまいち理解できてないです。
教えていただけるとありがたいです。
2023.07.13 19:01
まーぼさん 
FE シルバーマイスター
(No.2)
proc(5)からproc(1)までは

n = 0ならば戻るの条件に合わず、そうでなければの方を通り実行され、①と②が繰り返し実行され

54321と順に印字されることは分かると思います。

問題はproc(0)からです。

proc(0)を実行したとき、「n = 0ならば戻る」が初めて真になります。

というわけで、proc(0)の呼び出し元に戻ります。

proc(0)を呼び出したのは、n=1のときの、②ですね。

n=1のときの②に戻ったので、次はn=1のときの③を実行し、1が印字されます。

次に④が実行され、戻ります。

proc(1)を呼び出したのは、n=2のときの②なので、n=2のときの③を実行して2が印字されます。

次に④が実行され、戻ります。

proc(2)を呼び出したのは、n=3のときの②なのでn=3のときの③を実行して2が印字されます。

以降同様に繰り返して5432112345と印字されます。
2023.07.13 19:35
まーぼさん 
FE シルバーマイスター
(No.3)
最後は

proc(2)を呼び出したのは、n=3のときの②なのでn=3のときの③を実行して3が印字されます。

の間違いです。
2023.07.13 19:43
電タックさん 
FE ブロンズマイスター
(No.4)
処理が止まっているだけで残っているからです。

proc(5)を実行した時に
再帰部分を無視してみると、nである5が2回出力されるのは見て取れると思います。
ですが54321と1回ずつしか現れていません。

この手の単純な処理の場合5と提示されていても、小さい数で置き換えると考えやすいです。

■n=2
proc(2)
__2出力
__proc(1)
____1出力
____proc(0)→を実行しますが何も出来ず終わります「n=0 ならば戻る」
____1出力
__2出力

という感じで途中でproc(n-1)を呼び出した後の処理も待たされているだけで消滅しているわけではないからです。

またこういう単純な再帰であれば小さな数で置き換える以外に、
上のような別の呼び出しを全て展開した状態に並べるのは、まーぼさんの下記引用(No.5)
https://www.fe-siken.com/bbs/4939.html
https://www.ipa.go.jp/shiken/mondai-kaiotu/sg_fe/koukai/t6hhco0000003zx0-att/2023r05_fe_kamoku_b_qs.pdf
がとてもわかりやすく間違いが少ないと思います。
2023.07.13 20:26

返信投稿用フォーム

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

その他のスレッド


Pagetop