再帰呼出しの戻り値|擬似言語のトレース解説と練習問題

レベル:入門 / タグ:再帰・if

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

プログラム

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

何をしているか

関数 f は、n が 1 以下なら決まった値を返し、そうでなければ「n + f(n から一定の数を引いた値)」を返します。f の中で f を呼ぶので、答えが出るまで呼出しが積み重なります。引く数と、止まったときに返す値は、問題ごとに違います。

トレースのコツ

  • 行きと帰りに分けます。行きでは、止まる条件に当たるまで、呼び出す式だけを縦に書き並べます。
  • 止まる条件に当たったら、その戻り値を1つ上の式に入れ、下から順に計算して戻ります。
  • 引数がどう変わるかを先に並べると、呼出しの回数がすぐ分かります。2 ずつ減るなら 7 → 5 → 3 → 1 で4回です。

よくある間違い

  • 止まる条件の戻り値を思い込みで決める。0 を返すのか 1 を返すのかは、必ずプログラムで確かめます。
  • 止まるときの n を間違える。ちょうど 1 で止まるとは限りません。0 や負の数も「1 以下」です。
  • 行きの途中で計算を始めてしまう。奥の呼出しが返ってくるまで、足し算はできません。

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

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

#行したこと手続n
12条件判定(偽)f6
22条件判定(偽) f4
32条件判定(偽)  f2
42条件判定(真)   f0
53戻る(0)   f0
65戻る(2)  f2
75戻る(6) f4
85戻る(12)f6

この例題で問われること

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

答え 12

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

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

答え 3

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

練習問題 標準(10問)

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

  1. 問題01 f(12)
  2. 問題02 f(11)
  3. 問題03 f(5)
  4. 問題04 f(10)
  5. 問題05 f(6)
  6. 問題06 f(16)
  7. 問題07 f(15)
  8. 問題08 f(9)
  9. 問題09 f(13)
  10. 問題10 f(13)
もっと解く(追加の20問)
  1. 問題11 f(11)
  2. 問題12 f(5)
  3. 問題13 f(13)
  4. 問題14 f(12)
  5. 問題15 f(12)
  6. 問題16 f(7)
  7. 問題17 f(13)
  8. 問題18 f(7)
  9. 問題19 f(11)
  10. 問題20 f(14)
  11. 問題21 f(10)
  12. 問題22 f(16)
  13. 問題23 f(14)
  14. 問題24 f(16)
  15. 問題25 f(9)
  16. 問題26 f(14)
  17. 問題27 f(7)
  18. 問題28 f(9)
  19. 問題29 f(10)
  20. 問題30 f(9)

ほかのアルゴリズム