Scheme でローン計算

勉強のために Scheme でローン計算する関数を作ってみました。

(define (fukuri moto riritu hensai c)
  (let ((tuki (/ riritu 12)))
    (if (> (* tuki moto) hensai)
      'oops!
      (if (< 0 (- moto hensai))
        (fukuri (* (- moto hensai) (+ 1 tuki)) riritu hensai (+ c 1))
        (string-append (number->string (quotient c 12))
                       "year "
                       (number->string (remainder c 12))
                       "month (total:"
                       (number->string (* hensai c))
                       ")")))))

例えば年利 14% で 1000 万円借りた場合、毎月いくら返済すると何年かかるか、というのを調べるには

gosh> (fukuri 1000 0.14 10 0)
oops!

毎月 10 万円ずつだと、利子も返せず永遠にローンが終わりません。

gosh> (fukuri 1000 0.14 12 0)
"23year 3month (total:3348)"

12 万円ずつだと 23 年 3 ヶ月で完済し、総額 3348 万円の支払いです。

gosh> (fukuri 1000 0.14 13 0)
"15year 8month (total:2444)"

生活を切り詰めて 13 万円ずつ返済すると 15 年 8 ヶ月で完済し、総額 2444 万円の支払いになります。

gosh> (fukuri 1000 0.14 20 0)
"6year 2month (total:1480)"

がんばって 20 万円ずつ返済すると、6 年 2 ヶ月で完済し、総額 1480 万円の支払いです。


今回わかったのは、借金をしたら速やかに返済すること、借用は可能な限り少なく抑えること、金利はできるだけ低いところから借りること、そもそも借金しないこと、などです。

わからないのは、この関数は末尾再起になっているのかどうか(したつもり)、計算に必要な月数を最初の呼び出しで 0 で与えなければならない(かっこ悪い)ので、スマートな方法はないものか、という点です。