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

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

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

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

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

〔プログラム〕

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

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

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

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

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

設問1

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

解答群

正解:ウ 7

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

設問2

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

解答群

正解:ウ 56

  • 呼出しは全部で8回行われます。
  • 奥の呼出しから順に 0 → 2 → 6 → 12 → 20 → 30 → 42 → 56 を返し、最後に返る 56 が答えです。

本番形式

問 次のプログラム中の[ a ]に入れる正しい答えを,解答群の中から選べ。

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

関数 f を f(14) として呼び出すと,戻り値は 56 となる。

〔プログラム〕

○整数型: f(整数型: n)
if (n ≦ 1)
return 0
endif
return n + f([ a ])

解答群

正解:エ n - 2

  • それぞれの選択肢を空欄に入れて,実際に動かした結果は次のとおりです。
  • 「n - 5」→ 戻り値は 27
  • 「n ÷ 2 の商」→ 戻り値は 24
  • 「2 - n」→ 戻り値は 14
  • 「n - 2」→ 戻り値は 56(正解)
  • 「n」→ 繰返しが終わらない
  • 「n - 1」→ 戻り値は 104

解説

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

行番号つきのプログラム

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

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

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

#行したこと手続n
12条件判定(偽)f14
22条件判定(偽) f12
32条件判定(偽)  f10
42条件判定(偽)   f8
52条件判定(偽)    f6
62条件判定(偽)     f4
72条件判定(偽)      f2
82条件判定(真)       f0
93戻る(0)       f0
105戻る(2)      f2
115戻る(6)     f4
125戻る(12)    f6
135戻る(20)   f8
145戻る(30)  f10
155戻る(42) f12
165戻る(56)f14