HOME»基本情報技術者試験掲示板»再帰処理について
投稿する
再帰処理について [5800]
でんのすけさん(No.1)
科目B試験範囲である再帰処理の理解に苦しんでいます。
範囲のため応用情報にも出題されている内容を解いているのですが、いまいち理解が出来ません。下記問題内容です。
(応用情報技術者試験平成25年度秋午前8問改題より抜粋)
問:再帰的に定義された手続procで、proc(5)を実行したとき、印字される数字の順番を並べたものはどれか
[プログラム]
1:〇:proc(整数型:n)
2: if(nが0と等しい)
3: return
4: else
5: nを印字する
6: proc(n-1)
7: nを印字する
8: endif
上記になります。
出力として、5432112345が正解だそうですが、なぜ一度n=0になったのにproc(1)が呼び出されるのか分かりません。3行目のreturnで値が減っていたのを戻しているのでしょうか?どうか分かりやすくご教授いただけたら幸いです。
よろしくお願いします。
範囲のため応用情報にも出題されている内容を解いているのですが、いまいち理解が出来ません。下記問題内容です。
(応用情報技術者試験平成25年度秋午前8問改題より抜粋)
問:再帰的に定義された手続procで、proc(5)を実行したとき、印字される数字の順番を並べたものはどれか
[プログラム]
1:〇:proc(整数型:n)
2: if(nが0と等しい)
3: return
4: else
5: nを印字する
6: proc(n-1)
7: nを印字する
8: endif
上記になります。
出力として、5432112345が正解だそうですが、なぜ一度n=0になったのにproc(1)が呼び出されるのか分かりません。3行目のreturnで値が減っていたのを戻しているのでしょうか?どうか分かりやすくご教授いただけたら幸いです。
よろしくお願いします。
2025.02.16 15:32
y4 kさん(No.2)
★FE ブロンズマイスター
整数型の引数nが0の時にそのままreturnしますが,
それ以外では以下の処理です
~~~ここから~~~
nを印字
proc(n-1)の実行
nを印字
~~~ここまで~~~
なので、proc(5)では以下の様に動作します。
proc(5)の開始
5を印字する
proc(4)の開始
4を印字する
proc(3)の開始
3を印字する
proc(2)の開始
2を印字する
proc(1)の開始
1を印字する
proc(0)の開始・終了
1を印字する
proc(1)の終了
2を印字する
proc(2)の終了
3を印字する
proc(3)の終了
4を印字する
proc(4)の終了
5を印字する
proc(5)の終了
結果印字されるのは
5→4→3→2→1→1→2→3→4→5
それ以外では以下の処理です
~~~ここから~~~
nを印字
proc(n-1)の実行
nを印字
~~~ここまで~~~
なので、proc(5)では以下の様に動作します。
proc(5)の開始
5を印字する
proc(4)の開始
4を印字する
proc(3)の開始
3を印字する
proc(2)の開始
2を印字する
proc(1)の開始
1を印字する
proc(0)の開始・終了
1を印字する
proc(1)の終了
2を印字する
proc(2)の終了
3を印字する
proc(3)の終了
4を印字する
proc(4)の終了
5を印字する
proc(5)の終了
結果印字されるのは
5→4→3→2→1→1→2→3→4→5
2025.02.16 16:27
QMさん(No.3)
★FE ゴールドマイスター
応用情報の問題なら応用情報のサイトで訊く方がいいような気もしますが。
一つのprocが何をするのか、大枠を把握しましょう。
メインとなるのは5~7行目。
proc(5)なら、
だから出力の最初と最後が5。
proc(0)の後にproc(1)が呼び出されているのではなく、
proc(1)が1を2つ出力しています。
一つのprocが何をするのか、大枠を把握しましょう。
メインとなるのは5~7行目。
proc(5)なら、
5を印字する
proc(4)の結果がここに入る
5を印字する
です。proc(4)の結果がここに入る
5を印字する
だから出力の最初と最後が5。
proc(0)の後にproc(1)が呼び出されているのではなく、
proc(1)が1を2つ出力しています。
2025.02.16 16:31
jjon-comさん(No.4)
★FE プラチナマイスター
再帰を自分自身の呼び出しと考えず、同じ処理をおこなう別人の呼び出しと考えてみてはどうでしょう。
proc(5)の実行を指示されたAさんは、
(A1) まず5を印字して
(A2) Bさんにproc(4)の実行を指示して、処理の終了を待ち、
(A3) (Bさんの処理が終わった後で)5を印字します
proc(4)の実行を指示されたBさんは、
(B1) まず4を印字して
(B2) Cさんにproc(3)の実行を指示して、処理の終了を待ち、
(B3) (Cさんの処理が終わった後で)4を印字します
proc(3)の実行を指示されたCさんは、
(C1) まず3を印字して
(C2) Dさんにproc(2)の実行を指示して、処理の終了を待ち、
(C3) (Dさんの処理が終わった後で)3を印字します
proc(2)の実行を指示されたDさんは、
(D1) まず2を印字して
(D2) Eさんにproc(1)の実行を指示して、処理の終了を待ち、
(D3) (Eさんの処理が終わった後で)2を印字します
proc(1)の実行を指示されたEさんは、
(E1) まず1を印字して
(E2) Fさんにproc(0)の実行を指示して、処理の終了を待ち、
(E3) (Fさんの処理が終わった後で)1を印字します
proc(0)の実行を指示されたFさんは、
(F1) 引数が0と等しいのでただ処理を終了します(return)
このA,B,C,D,E,Fの6人が連携した処理の流れは全体として次のようになります。
(A1)(A2)→(B1)(B2)→(C1)(C2)→(D1)(D2)→(E1)(E2)→(F1)→(E3)→(D3)→(C3)→(B3)→(A3)
proc(5)の実行を指示されたAさんは、
(A1) まず5を印字して
(A2) Bさんにproc(4)の実行を指示して、処理の終了を待ち、
(A3) (Bさんの処理が終わった後で)5を印字します
proc(4)の実行を指示されたBさんは、
(B1) まず4を印字して
(B2) Cさんにproc(3)の実行を指示して、処理の終了を待ち、
(B3) (Cさんの処理が終わった後で)4を印字します
proc(3)の実行を指示されたCさんは、
(C1) まず3を印字して
(C2) Dさんにproc(2)の実行を指示して、処理の終了を待ち、
(C3) (Dさんの処理が終わった後で)3を印字します
proc(2)の実行を指示されたDさんは、
(D1) まず2を印字して
(D2) Eさんにproc(1)の実行を指示して、処理の終了を待ち、
(D3) (Eさんの処理が終わった後で)2を印字します
proc(1)の実行を指示されたEさんは、
(E1) まず1を印字して
(E2) Fさんにproc(0)の実行を指示して、処理の終了を待ち、
(E3) (Fさんの処理が終わった後で)1を印字します
proc(0)の実行を指示されたFさんは、
(F1) 引数が0と等しいのでただ処理を終了します(return)
このA,B,C,D,E,Fの6人が連携した処理の流れは全体として次のようになります。
(A1)(A2)→(B1)(B2)→(C1)(C2)→(D1)(D2)→(E1)(E2)→(F1)→(E3)→(D3)→(C3)→(B3)→(A3)
2025.02.16 16:43
でんのすけさん(No.5)
3名の方々回答ありがとうございました!
最初の再帰では6行目でn-1しているので減っていきましたが、n=0で帰ってくるときは7行目に帰ってくるので増えていくということですね!
ありがとうございました!
最初の再帰では6行目でn-1しているので減っていきましたが、n=0で帰ってくるときは7行目に帰ってくるので増えていくということですね!
ありがとうございました!
2025.02.17 19:58