再帰呼出しの戻り値 問題22

標準 レベル:入門 / このアルゴリズムの解説を読む

練習モードは行番号つきで順に解く形式、本番形式は公開問題と同じ体裁の1問です。

関数 f は、自分自身を呼び出して値を計算する。

次のプログラムを f(16) で呼び出す。

〔プログラム〕

1○整数型: f(整数型: n)
2 if (n ≦ 1)
3 return 1
4 endif
5 return n + f(n - 2)
ヒント1:トレース表の枠を見る

この列で表を作り、文を1つ実行するたびに1行足していきます。

#行したことn
ヒント2:最初の4ステップを見る

続きを同じ要領で書いていきます。太字は、その文で値が変わった変数です。

#行したこと手続n
12条件判定(偽)f16
22条件判定(偽) f14
32条件判定(偽)  f12
42条件判定(偽)   f10

設問1

5行目が実行される回数はどれか。

解答群

正解:ウ 8

  • 5行目は8回実行されます。トレース表で 5行目の行を数えると確かめられます。

設問2

f(16) を呼び出したときの戻り値はどれか。

解答群

正解:ウ 73

  • 呼出しは全部で9回行われます。
  • 奥の呼出しから順に 1 → 3 → 7 → 13 → 21 → 31 → 43 → 57 → 73 を返し、最後に返る 73 が答えです。

本番形式

問 次の記述中の[ a ]と[ b ]に入れる正しい答えの組合せを,解答群の中から選べ。

関数 f は,自分自身を呼び出して値を計算する。

関数 f を f(16) として呼び出すと,プログラム中の α の行は[ a ]回実行され,戻り値は[ b ]となる。

〔プログラム〕

○整数型: f(整数型: n)
if (n ≦ 1)
return 1
endif
return n + f(n - 2) /*** α ***/

解答群

ab
716
773
816
873
874
916
973
974

正解:エ a 8,b 73

  • 5行目は8回実行されます。トレース表で 5行目の行を数えると確かめられます。
  • 呼出しは全部で9回行われます。
  • 奥の呼出しから順に 1 → 3 → 7 → 13 → 21 → 31 → 43 → 57 → 73 を返し、最後に返る 73 が答えです。

α の行は,下のトレース表(行番号つき)では 5 行目です。

解説

f(16) は 16 + f(16 - 2) です。n が 1 以下になるまで呼出しが続き、そこで 1 が返ります。 戻ってくる順に足していくと 73 になります。

行番号つきのプログラム

1○整数型: f(整数型: n)
2 if (n ≦ 1)
3 return 1
4 endif
5 return n + f(n - 2)

トレース表(全ステップ)

太字は、その文で値が変わった変数です。設問が指している行は黄色、その回は濃い黄色、変数は青い列で示します。

#行したこと手続n
12条件判定(偽)f16
22条件判定(偽) f14
32条件判定(偽)  f12
42条件判定(偽)   f10
52条件判定(偽)    f8
62条件判定(偽)     f6
72条件判定(偽)      f4
82条件判定(偽)       f2
92条件判定(真)        f0
103戻る(1)        f0
115戻る(3)       f2
125戻る(7)      f4
135戻る(13)     f6
145戻る(21)    f8
155戻る(31)   f10
165戻る(43)  f12
175戻る(57) f14
185戻る(73)f16