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

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

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

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

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

〔プログラム〕

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

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

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

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

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

設問1

f(4) を呼び出すと戻り値は 15 になる。プログラム中の [ a ] に入れる正しい答えはどれか。

解答群

正解:ア f(n - 1) + f(n - 2)

  • それぞれの選択肢を空欄に入れて、実際に動かした結果は次のとおりです。
  • 「f(n - 1) + f(n - 2)」→ 戻り値は 15(正解)
  • 「f(n - 1) + f(n - 1)」→ 戻り値は 24
  • 「f(n - 1) × f(n - 2) + 1」→ 戻り値は 311
  • 「f(n - 1) + n - 2」→ 戻り値は 6

設問2

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

解答群

正解:ウ 9

  • 2行目の条件式は9回評価され、真が5回、偽が4回です。

設問3

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

解答群

正解:イ 5

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

本番形式

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

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

関数 f を f(4) として呼び出すと,戻り値は[ a ]となる。

〔プログラム〕

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

解答群

正解:エ 15

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

解説

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

行番号つきのプログラム

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

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

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

#行したこと手続n
12条件判定(偽)f4
22条件判定(偽) f3
32条件判定(偽)  f2
42条件判定(真)   f1
53戻る(3)   f1
62条件判定(真)   f0
73戻る(3)   f0
85戻る(6)  f2
92条件判定(真)  f1
103戻る(3)  f1
115戻る(9) f3
122条件判定(偽) f2
132条件判定(真)  f1
143戻る(3)  f1
152条件判定(真)  f0
163戻る(3)  f0
175戻る(6) f2
185戻る(15)f4