まずはかけ算ばっかするproductを定義してみる。これはほとんど問題1-30 - 理系学生日記からパクった。
(define (product term a next b) (define (iter a result) (if (> a b) result (iter (next a) (* (term a) result)))) (iter a 1))
じっさいに1から6までかけまくってみると720になって、たぶん合ってる。
gosh> (product identity 1 inc 6) 720
これ使うと、階乗とかちょうキレい!
(define (identity x) x) (define (inc x) (+ x 1)) (define (factorial n) (product identity 1 inc n))
キレいすぐる!!
gosh> (factorial 6) 720
あと、product使っても使って、を計算しろっていう課題がある。
(define (plus-2 x) (+ x 2)) (define (square x) (* x x)) (define (approx-pi n) (define (term i) (/ (* (- i 1) (+ i 1)) (square i))) (* 4 (product term 3.0 plus-2 n)))
とかやって計算してみるお。
gosh> (approx-pi 10000) 3.1417497371492855
意外と精度がよいです。