
出典:公益社団法人 日本技術士会「技術士第一次試験 過去問題」
再帰関数n(c)(c==0でreturn、空欄ア、n(--c)、空欄イ)に、printf("%d ", c)を空欄アのみ、又は空欄イのみに挿入して実行したときの、1回目と2回目の表示を求める問題。
再帰呼出しの前後にprintfを置いたときの出力の違いを求める問題。
① 再帰呼出しの前の処理は呼ぶ順に、後の処理は戻る順(逆順)に実行される。--cは先に1減らしてから使う
② 1回目(ア): 10 9 … 1。2回目(イ): 1減った後の値が、戻る順に0 1 … 9
③ ③
n(10)は、c==0でなければ、空欄ア、n(--c)、空欄イの順に実行する。n(--c)により、cは呼出しの前に1減っている。1回目(アのみにprintf)は、再帰呼出しの前に、その時点のcを表示する。cは10、9、…、1の順で表示される(c==0で復帰して終了)ので、出力は「10 9 8 7 6 5 4 3 2 1」である。2回目(イのみにprintf)は、再帰呼出しから戻った後に表示する。表示される値は、--cで1減ったあとのcであり、最も深い呼出し(c=1のとき)から戻る順に、0、1、2、…、9となる。出力は「0 1 2 3 4 5 6 7 8 9」である。したがって③が正しい。
■ --c の意味
--c は「cを1減らしてから、その値を使う」という意味です。n(--c)では、この呼出しの中のc自体が1減った状態で、次のn()が呼ばれます。そのため、再帰呼出しから戻った後にcを表示すると、減った後の値が表示されます。
■ 再帰呼出しの実行順
n(10)の中でn(9)を呼ぶと、n(9)が最後まで終わってからn(10)の続き(空欄イ)に戻ります。そのため、
・空欄アの処理は、呼び出す順(n(10)→n(9)→…→n(1))に実行される
・空欄イの処理は、戻る順(n(1)→n(2)→…→n(10))に実行される
という逆の順序になります。
再帰呼出しの前の処理は、呼出しの深くなる順(降順)に、後の処理は、戻る順(逆順)に実行される。--cは、呼出し前にcを減らすので、後の処理では、減った後のcが見える。
キーワード: 再帰呼出し、C言語、前置デクリメント、スタック、プログラミング、情報工学部門