質問させていただきます H25秋 午前Q8
広告
まるこさん
(No.1)
秋に向けて猛勉強中のサラリーマンです。
納得いかない問題があるので質問させていただきます。
H25年秋 午前の問8です。
解説では「11」が入るイが正解ですが、
それ以前に、トレースを行うと、
544332211・・・と考えてしまうのですが。。。
n=5からスタート
0ではないため
5を印字
5-1=4を呼び出す
4を印字
4を印字
4-1=3
3を印字
3を印字
3-1=2
2を印字・・・
このようになるのではないんでしょうか?
どうかご教授願います。
納得いかない問題があるので質問させていただきます。
H25年秋 午前の問8です。
解説では「11」が入るイが正解ですが、
それ以前に、トレースを行うと、
544332211・・・と考えてしまうのですが。。。
n=5からスタート
0ではないため
5を印字
5-1=4を呼び出す
4を印字
4を印字
4-1=3
3を印字
3を印字
3-1=2
2を印字・・・
このようになるのではないんでしょうか?
どうかご教授願います。
2015.09.05 22:34
ささにしきさん
(No.2)
まず再帰の意味を理解しなければならないです。(慣れないと難しいです)
この場合の再帰とは手続きの中にさらに手続きがあることを指します。
下記に動作を記しました。
なお→は再帰処理開始で、←は再帰処理終了という意味で付けています。
proc(5)
5を印字する
proc(4)を呼び出す→
4を印字する
proc(3)を呼び出す→
3を印字する
proc(2)を呼び出す→
2を印字する
proc(1)を呼び出す→
1を印字する
proc(0)を呼び出す→
n=0 なのでproc(1)に戻る←
1を印字する。proc(2)に戻る←
2を印字する。proc(3)に戻る←
3を印字する。proc(4)に戻る←
4を印字する。proc(5)に戻る←
5を印字する
proc(5)の中にproc(4)があり、proc(4)の中にproc(3)があり・・・と
proc(5)からproc(0)まで6階層あります。
マトリョーシカ人形を最後まで開けていき、元に戻していくイメージです。
この場合の再帰とは手続きの中にさらに手続きがあることを指します。
下記に動作を記しました。
なお→は再帰処理開始で、←は再帰処理終了という意味で付けています。
proc(5)
5を印字する
proc(4)を呼び出す→
4を印字する
proc(3)を呼び出す→
3を印字する
proc(2)を呼び出す→
2を印字する
proc(1)を呼び出す→
1を印字する
proc(0)を呼び出す→
n=0 なのでproc(1)に戻る←
1を印字する。proc(2)に戻る←
2を印字する。proc(3)に戻る←
3を印字する。proc(4)に戻る←
4を印字する。proc(5)に戻る←
5を印字する
proc(5)の中にproc(4)があり、proc(4)の中にproc(3)があり・・・と
proc(5)からproc(0)まで6階層あります。
マトリョーシカ人形を最後まで開けていき、元に戻していくイメージです。
2015.09.05 23:53
まるこさん
(No.3)
>ささにしきさん
ご説明いただき、ありがとうございます。
開始の処理と、終了の処理で印字の作業が分かれてるんですね・・・
再帰的処理のイメージをつかむことができました。
今後も質問させていただくかもしれませんが、
どうぞよろしくお願いいたします。
2015.09.06 21:48
きのこさん
(No.4)
もう解決されているかと思いますが、プログラムで呼び出すサブルーチンが、自分自身の時が再帰的処理と考えるといいかもしれません。
・通常のサブルーチン
proc(A){
print(A)
test(A-1) ⇒(A-1)を引数に何らかの処理をさせる
print(A) ⇒test(A-1)でAの値に変化がなければ、上段のprint(A)と同じ値が印字
}
・再帰的処理
proc(A){
print(A) ⇒Aを印字
proc(A-1) ⇒(A-1)を引数にproc()を呼び出す
print(A) ⇒Aを印字
}
当然、proc(A-1)の中で再びproc(A-2)を呼び出し…と終了条件まで繰り返します。
proc(A-1)が終了しないとproc(A)に戻れません。
処理順を番号で示すと、
proc(A){
①print(A)
proc(A-1) ⇒ proc(A-1){
⑤print(A) | ②print(A-1)
} | proc(A-2) ⇒ proc(A-2){
| ④print(A-1) | ③…略
| } | }
proc()関数の上のprintと下のprintは同じ値を印字します。
その為、印字順は「A,A-1,A-2,…,A-1,A」となります。
・通常のサブルーチン
proc(A){
print(A)
test(A-1) ⇒(A-1)を引数に何らかの処理をさせる
print(A) ⇒test(A-1)でAの値に変化がなければ、上段のprint(A)と同じ値が印字
}
・再帰的処理
proc(A){
print(A) ⇒Aを印字
proc(A-1) ⇒(A-1)を引数にproc()を呼び出す
print(A) ⇒Aを印字
}
当然、proc(A-1)の中で再びproc(A-2)を呼び出し…と終了条件まで繰り返します。
proc(A-1)が終了しないとproc(A)に戻れません。
処理順を番号で示すと、
proc(A){
①print(A)
proc(A-1) ⇒ proc(A-1){
⑤print(A) | ②print(A-1)
} | proc(A-2) ⇒ proc(A-2){
| ④print(A-1) | ③…略
| } | }
proc()関数の上のprintと下のprintは同じ値を印字します。
その為、印字順は「A,A-1,A-2,…,A-1,A」となります。
2015.09.07 09:10
きのこさん
(No.5)
この投稿は削除されました。(2015.09.07 09:11)
2015.09.07 09:11
きのこさん
(No.6)
この投稿は削除されました。(2015.09.07 09:11)
2015.09.07 09:11
まるこさん
(No.7)
>きのこさん
ありがとうございます、
参考にさせていただきます。
2015.09.09 08:06
返信投稿用フォーム
スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。