2つに枝分かれする再帰 問題02

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

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

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

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

〔プログラム〕

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

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

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

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

#行したこと手続n
12条件判定(偽)f5
22条件判定(偽) f4
32条件判定(偽)  f3
42条件判定(偽)   f2
52条件判定(真)    f1
63戻る(2)    f1

設問1

2行目の条件式が評価される回数はどれか。

解答群

正解:ウ 15

  • 2行目の条件式は15回評価され、真が8回、偽が7回です。

設問2

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

解答群

正解:イ 8

  • 3行目が実行されるのは、2行目の条件が真になったときだけです。
  • 2行目の条件は15回評価され、真になるのは8回です。したがって 3行目は8回実行されます。

設問3

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

解答群

正解:ウ 16

  • 呼出しは全部で15回行われます。
  • 奥の呼出しから順に 2 → 2 → 4 → 2 → 6 → … → 2 → 4 → 2 → 6 → 16 を返し、最後に返る 16 が答えです。

本番形式

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

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

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

〔プログラム〕

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

解答群

ab
1416
1417
155
1516
1616
1617

正解:エ a 15,b 16

  • 2行目の条件式は15回評価され、真が8回、偽が7回です。
  • 呼出しは全部で15回行われます。
  • 奥の呼出しから順に 2 → 2 → 4 → 2 → 6 → … → 2 → 4 → 2 → 6 → 16 を返し、最後に返る 16 が答えです。

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

解説

f(5) は f(5 - 1) と f(5 - 2) の和です。呼出しを木の形に書き出し、n が 1 以下になった所に 2 を書いて、下から足し上げます。 戻り値は 16 です。

行番号つきのプログラム

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

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

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

#行したこと手続n
12条件判定(偽)f5
22条件判定(偽) f4
32条件判定(偽)  f3
42条件判定(偽)   f2
52条件判定(真)    f1
63戻る(2)    f1
72条件判定(真)    f0
83戻る(2)    f0
95戻る(4)   f2
102条件判定(真)   f1
113戻る(2)   f1
125戻る(6)  f3
132条件判定(偽)  f2
142条件判定(真)   f1
153戻る(2)   f1
162条件判定(真)   f0
173戻る(2)   f0
185戻る(4)  f2
195戻る(10) f4
202条件判定(偽) f3
212条件判定(偽)  f2
222条件判定(真)   f1
233戻る(2)   f1
242条件判定(真)   f0
253戻る(2)   f0
265戻る(4)  f2
272条件判定(真)  f1
283戻る(2)  f1
295戻る(6) f3
305戻る(16)f5