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 で与えなければならない(かっこ悪い)ので、スマートな方法はないものか、という点です。