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

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

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

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

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

〔プログラム〕

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

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

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

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

#行したこと手続n
12条件判定(偽)f15
22条件判定(偽) f13
32条件判定(偽)  f11
42条件判定(偽)   f9

設問1

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

解答群

正解:ウ n - 2

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

設問2

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

解答群

正解:ウ 7

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

本番形式

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

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

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

〔プログラム〕

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

解答群

ab
615
663
664
715
763
764
815
863

正解:オ a 7,b 63

  • 5行目は7回実行されます。トレース表で 5行目の行を数えると確かめられます。
  • 呼出しは全部で8回行われます。
  • 奥の呼出しから順に 0 → 3 → 8 → 15 → 24 → 35 → 48 → 63 を返し、最後に返る 63 が答えです。

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

解説

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

行番号つきのプログラム

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

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

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

#行したこと手続n
12条件判定(偽)f15
22条件判定(偽) f13
32条件判定(偽)  f11
42条件判定(偽)   f9
52条件判定(偽)    f7
62条件判定(偽)     f5
72条件判定(偽)      f3
82条件判定(真)       f1
93戻る(0)       f1
105戻る(3)      f3
115戻る(8)     f5
125戻る(15)    f7
135戻る(24)   f9
145戻る(35)  f11
155戻る(48) f13
165戻る(63)f15