はじめに
基本情報技術者試験の科目Bでは、再帰関数 の問題がよく出題されます。
その中でも、
- 元利合計(複利)
- 階乗
- フィボナッチ数列
- 最大公約数
は定番問題です。
今回は、元利合計を求める再帰問題を使って、
「再帰ってどう考えればいいの?」
という疑問をやさしく解説します。

ハク
再帰って毎回よく分からなくなるんだよね…

レイ
大丈夫です。『1つ前の結果を使う』と考えれば簡単ですよ。
元利合計の公式
元金 p を年利 r で n 年運用したときの金額は、
で求められます。
用語の意味
| 記号 | 意味 |
|---|---|
p | 元金 |
r | 年利 |
n | 年数 |
例
- 元金:100円
- 年利:10% (
r = 0.1) - 年数:3年
すると
問題
関数 fv(p, r, n) は、n 年後の元利合計を返す。
実数型: fv(実数型: p, 実数型: r, 整数型: n)
if ( a )
return p
else
return b
endif
a と b に入る適切なものを答えよ。
まず fv の意味を理解しよう
fv(p, r, n) は、
n年後の元利合計を返す関数
です。
つまり、
fv(p, r, 2)
は、
と同じ意味です。
対応表
| 関数 | 意味 |
|---|---|
fv(p, r, 0) | 0年後の金額 |
fv(p, r, 1) | 1年後の金額 |
fv(p, r, 2) | 2年後の金額 |
fv(p, r, 3) | 3年後の金額 |

ハク
fv(p, r, 2) は2年後の金額ってことなんだ!

レイ
はい。数式を関数名に置き換えているだけです。
終了条件を考える
0年後なら利息は付かないので、
したがって
if (n = 0)
return p
となります。
再帰部分を考える
3年後の金額は、
です。
これを分解すると、
ここが重要!
p(1+r)^2 は 2年後の金額。
つまり、
fv(p, r, 2)
と書けます。
したがって、3年後の金額は
fv(p, r, 3)
= fv(p, r, 2) × (1 + r)
と書けます。
一般化すると
fv(p, r, n)
= fv(p, r, n - 1) × (1 + r)

ハク
n年後って、1年前の結果に利息を掛けるだけなんだ!

レイ
その通りです。これが再帰の考え方です。
完成したプログラム
実数型: fv(実数型: p, 実数型: r, 整数型: n)
if (n = 0)
return p
else
return fv(p, r, n - 1) × (1 + r)
endif
正解
| a | b |
|---|---|
n = 0 | fv(p, r, n - 1) × (1 + r) |
実際の計算例
fv(100, 0.1, 3) を計算してみます。
fv(100, 0.1, 3)
= fv(100, 0.1, 2) × 1.1
= fv(100, 0.1, 1) × 1.1 × 1.1
= fv(100, 0.1, 0) × 1.1 × 1.1 × 1.1
= 100 × 1.1 × 1.1 × 1.1
= 133.1
再帰問題の解き方
再帰問題では、次の3ステップで考えると解きやすいです。
① 終了条件を考える
これ以上分解しなくてよい状態。
② 1つ前の状態を考える
今回なら n-1 年後。
③ 前の結果から現在を求める
(n-1) 年後 × (1+r)。

ハク
0年後ならそのまま!
それ以外は1年前の結果に利息を掛ける!
まとめ
fv(p, r, n)は n年後の元利合計n = 0のときはpn > 0のときは
fv(p, r, n - 1) × (1 + r)
- 再帰の基本は
「1つ前の結果を使う」


コメント