大滝本4.10について

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
waaさん  
(No.1)
大滝本の4.10について
再帰の問題なのですが、再帰の処理がいまいちよくわかっていません。
とくに一通りスタックに追加してからの、呼び出し元に戻るという部分の理解が曖昧です。

大滝本を持っている方、よければ再帰処理の流れを教えていただきたいです!
2025.10.30 12:57
jjon-comさん 
FE プラチナマイスター
(No.2)
その本が手元にないので直接の回答ではありません。

再帰についてはこの掲示板で何度も話題になり、私も解説を投稿したことがあります。

https://www.fe-siken.com/bbs/5800.html のNo.4
https://www.fe-siken.com/bbs/5930.html のNo.8 No.9
https://www.fe-siken.com/bbs/5898.html のNo.5
2025.10.30 17:20
jjon-comさん 
FE プラチナマイスター
(No.3)
stack[1] = {1, 2, 3}
stack[2] = {1, 2, 3}
stack[3] = {1, 2, 3}

○proc()
  if (stack[1]が空なら)
    /* 何もしない */
  else
    stack[1]からpopした値をstack[3]にpush
    proc()
    stack[3]からpopした値をstack[2]にpush
  endif

初回のproc()の呼び出し時は、stack[1]は空ではないのでelse句が実行されます。

+ーーーー
|(stack[1] = {1, 2, 3} で 空ではないから次を実行)
|stack[1]からpopした値をstack[3]にpush ★a
|proc()
|stack[3]からpopした値をstack[2]にpush
+ーーーー

★aの実行後をイメージすると、stack[1] = {1, 2} になり空ではないので、入れ子のproc()の内容はこうなります。

+ーーーー
|(stack[1] = {1, 2, 3} で 空ではないから次を実行)
|stack[1]からpopした値をstack[3]にpush
|+ーーーー
||(stack[1] = {1, 2} で 空ではないから次を実行)
||stack[1]からpopした値をstack[3]にpush ★b
||proc()
||stack[3]からpopした値をstack[2]にpush
|+ーーーー
|stack[3]からpopした値をstack[2]にpush
+ーーーー

★bの実行後をイメージすると、stack[1] = {1} になり空ではないので、さらに入れ子のproc()の内容はこうなります。

+ーーーー
|(stack[1] = {1, 2, 3} で 空ではないから次を実行)
|stack[1]からpopした値をstack[3]にpush
|+ーーーー
||(stack[1] = {1, 2} で 空ではないから次を実行)
||stack[1]からpopした値をstack[3]にpush
||+ーーーー
|||(stack[1] = {1} で 空ではないから次を実行)
|||stack[1]からpopした値をstack[3]にpush ★c
|||proc()
|||stack[3]からpopした値をstack[2]にpush
||+ーーーー
||stack[3]からpopした値をstack[2]にpush
|+ーーーー
|stack[3]からpopした値をstack[2]にpush
+ーーーー

★cの実行後をイメージすると、stack[1] が空になるので、さらにさらに入れ子のproc()の内容は /* 何もしない */ です。

+ーーーー
|(stack[1] = {1, 2, 3} で 空ではないから次を実行)
|stack[1]からpopした値をstack[3]にpush
|+ーーーー
||(stack[1] = {1, 2} で 空ではないから次を実行)
||stack[1]からpopした値をstack[3]にpush
||+ーーーー
|||(stack[1] = {1} で 空ではないから次を実行)
|||stack[1]からpopした値をstack[3]にpush
|||+ーーーー
||||(stack[1] = {} で 空になったので)
||||/* 何もしない */
|||+ーーーー
|||stack[3]からpopした値をstack[2]にpush
||+ーーーー
||stack[3]からpopした値をstack[2]にpush
|+ーーーー
|stack[3]からpopした値をstack[2]にpush
+ーーーー

結果として、この問題は、次の6命令を順に実行したら最終的にstack[2]の内容はどうなっているか、を問うています。
stack[1]からpopした値をstack[3]にpush
stack[1]からpopした値をstack[3]にpush
stack[1]からpopした値をstack[3]にpush
stack[3]からpopした値をstack[2]にpush
stack[3]からpopした値をstack[2]にpush
stack[3]からpopした値をstack[2]にpush
2025.10.31 00:24
jjon-comさん 
FE プラチナマイスター
(No.4)
再帰処理の流れを理解する要点は、
地を這う虫のように一行一行トレースを始めるのではなく、
プログラムの開始から終了までの全体の流れはこうなる、と、
自分自身を呼び出す入れ子の関係の全体像をイメージすることだと考えます。
各命令の実行により変数がどう変化していくかをトレースするのはその後です。

ちなみに。
「地を這う虫のように」というのはトレース作業を揶揄しているのではなく、
鳥瞰図・虫瞰図、という日本語があるからそう形容しただけです。念のため。
2025.10.31 08:44
waaさん  
(No.5)
詳しくありがとうございました。時間はかかりますが、自分で図を書き、理解できました!!
2025.11.01 15:06

返信投稿用フォーム

※CBT試験では出題内容の公開が禁止されているため、直接的・間接的を問わず、出題内容や難易度を尋ねる質問は厳禁です。
※宣伝や迷惑行為を防止するため、当サイト、姉妹サイト、IPAサイト以外のURLを含む記事の投稿はできません。

投稿記事削除用フォーム

投稿番号:
パスワード:

その他のスレッド


Pagetop