The big thing that’s happened this weekend was getting a car; I bought a 2007 Toyota Corolla. I still have some mixed feelings about this, but I think I’ll need it to survive the winters here.
These machines cost a lot! I dropped by http://www.edmunds.com/apps/calc/CalculatorController. But it’s a black box to me: I had no real idea how it was actually doing its calculation. So I tried to cook up the calculations from scratch:
(module car-payment mzscheme
;; Small toy code for calculating car stuff.
;; debt: number number number number -> number
;; Returns the amount of money owed after months pass,
;; given a particular monthly payment and apr rate.
(define (debt months current-debt monthly-payment apr)
(let loop ([n months]
[(= n 0) current-debt]
(let ([monthly-interest (/ apr 12)])
(loop (sub1 n)
(* (+ 1 monthly-interest)
(- current-debt monthly-payment))))])))
;; months-till-debt-free: number number number -> number
;; Returns how many months have to pass before we're debt free.
(define (months-till-debt-free initial-cost monthly-payment apr)
(let loop ([n 0])
(let ([new-debt (debt n initial-cost monthly-payment apr)])
[(<= new-debt 0) n]
[else (loop (add1 n))])))))
Now I could verify for myself: how long would it be until I dig myself out of a big hole?
> (months-till-debt-free 16300 327.93 0.0767)
Oh. Ok, so at least it looks like the code is doing the same thing as the Edmunds calculator. That’s good.
I should brush up on my recurrence relations, though, since I’m sure that there’s a closed form for this calculation.