2つに枝分かれする再帰|擬似言語のトレース解説と練習問題

レベル:中級 / タグ:再帰・if・呼出し回数

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

プログラム

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

何をしているか

f(n) は、f(n - 1) と、もう1つ小さい引数での呼出しの和を返します。n が 1 以下になったら、決まった値を返して止まります。

トレースのコツ

  • 呼出しを木の形に書きます。f(5) の下に、呼び出される2つを枝として並べます。
  • 葉(n が 1 以下)に戻り値を書き、下から上へ足し上げます。
  • 「条件式が評価される回数」は、木の節の数(呼出しの総数)と同じです。

よくある間違い

  • 同じ引数の呼出しを1回分しか数えない。f(2) が木の中に3回出てくれば、3回実行されます。
  • 左の枝だけ計算して、右の枝を忘れる。
  • 止まる条件の n ≦ 1 で、n が 0 や負になる場合を見落とす。

例題:f(6) を最後まで追う

上のプログラムを f(6) で呼び出したときの、全ステップのトレース表です。太字は、その文で値が変わった変数です。

#行したこと手続n
12条件判定(偽)f6
22条件判定(偽) f5
32条件判定(偽)  f4
42条件判定(偽)   f3
52条件判定(偽)    f2
62条件判定(真)     f1
73戻る(2)     f1
82条件判定(真)     f0
93戻る(2)     f0
105戻る(4)    f2
112条件判定(真)    f1
123戻る(2)    f1
135戻る(6)   f3
142条件判定(偽)   f2
152条件判定(真)    f1
163戻る(2)    f1
172条件判定(真)    f0
183戻る(2)    f0
195戻る(4)   f2
205戻る(10)  f4
212条件判定(偽)  f3
222条件判定(偽)   f2
232条件判定(真)    f1
243戻る(2)    f1
252条件判定(真)    f0
263戻る(2)    f0
275戻る(4)   f2
282条件判定(真)   f1
293戻る(2)   f1
305戻る(6)  f3
315戻る(16) f5
322条件判定(偽) f4
332条件判定(偽)  f3
342条件判定(偽)   f2
352条件判定(真)    f1
363戻る(2)    f1
372条件判定(真)    f0
383戻る(2)    f0
395戻る(4)   f2
402条件判定(真)   f1
413戻る(2)   f1
425戻る(6)  f3
432条件判定(偽)  f2
442条件判定(真)   f1
453戻る(2)   f1
462条件判定(真)   f0
473戻る(2)   f0
485戻る(4)  f2
495戻る(10) f4
505戻る(26)f6

この例題で問われること

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

答え 26

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

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

答え 25

  • 2行目の条件式は25回評価され、真が13回、偽が12回です。

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

答え 13

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

練習問題 標準(5問)

本試験と同じくらいの量。レベル:中級

  1. 問題01 f(6)
  2. 問題02 f(5)
  3. 問題03 f(4)
  4. 問題04 f(6)
  5. 問題05 f(5)
もっと解く(追加の10問)
  1. 問題06 f(4)
  2. 問題07 f(6)
  3. 問題08 f(6)
  4. 問題09 f(4)
  5. 問題10 f(6)
  6. 問題11 f(4)
  7. 問題12 f(6)
  8. 問題13 f(5)
  9. 問題14 f(5)
  10. 問題15 f(5)

ほかのアルゴリズム