## Monday, September 18, 2006

### (new car% [brand "toyota"] [type "corolla"])

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.  (provide (all-defined))    ;; 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]               [current-debt current-debt])      (cond        [(= n 0) current-debt]        [else         (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)])        (cond          [(<= 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)60`

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.