【基本情報 科目B】再帰で元利合計を求める問題をやさしく解説!「1つ前の結果を使う」がポイント

IT基礎

はじめに

基本情報技術者試験の科目Bでは、再帰関数 の問題がよく出題されます。

その中でも、

  • 元利合計(複利)
  • 階乗
  • フィボナッチ数列
  • 最大公約数

は定番問題です。

今回は、元利合計を求める再帰問題を使って、

「再帰ってどう考えればいいの?」

という疑問をやさしく解説します。

ハク
ハク

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

レイ
レイ

大丈夫です。『1つ前の結果を使う』と考えれば簡単ですよ。


元利合計の公式

元金 p を年利 rn 年運用したときの金額は、

p(1+r)np(1+r)^n

で求められます。


用語の意味

記号意味
p元金
r年利
n年数

  • 元金:100円
  • 年利:10% (r = 0.1)
  • 年数:3年

すると100×1.13=133.1100 \times 1.1^3 = 133.1


問題

関数 fv(p, r, n) は、n 年後の元利合計を返す。

実数型: fv(実数型: p, 実数型: r, 整数型: n)

if ( a )
return p
else
return b
endif

ab に入る適切なものを答えよ。


まず fv の意味を理解しよう

fv(p, r, n) は、

n年後の元利合計を返す関数

です。

つまり、

fv(p, r, 2)

は、p(1+r)2p(1+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年後なら利息は付かないので、p(1+r)0=pp(1+r)^0 = p

したがって

if (n = 0)
return p

となります。


再帰部分を考える

3年後の金額は、p(1+r)3p(1+r)^3

です。

これを分解すると、p(1+r)3=p(1+r)2×(1+r)p(1+r)^3 = p(1+r)^2 \times (1+r)


ここが重要!

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

正解

ab
n = 0fv(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 のときは p
  • n > 0 のときは
fv(p, r, n - 1) × (1 + r)
  • 再帰の基本は

「1つ前の結果を使う」

コメント

タイトルとURLをコピーしました