SICPを読む(21) 問題1.29 - 1.32
しばらく間が空いてしまった。
問題1.29
Simpsonの公式の前に、台形公式で解いてみた。
(define (integral f a b dx) (define (add-dx x) (+ dx x)) (define (term n) (+ (f n) (f (+ n dx)))) (* (sum term a add-dx (- b (/ dx 2))) dx 0.5)) (integral (lambda (x) x) 0 1 0.1) ; 2.0
終端がポイント。前回の追記を参照してください。
面倒なのでlabdaを使いました(えへ
では、Simpsonの公式
(define (simpson f a b n) (define h (/ (- b a) n)) (define (z k) (cond ((or (= k 0) (= k n)) 1) ((odd? k) 4) (else 2))) (define (y k) (* (z k) (f (+ a (* k h))))) (/ (* h (sum y 0 inc n)) 3.0))
複雑・・・。
問題1.30
(define (sum term a next b) (define (iter a result) (if (> a b) result (iter (next a) (+ result (term a))))) (trace iter) (iter a 0))
簡単!
問題1.31
PIを求める問題。3から数えて、偶数か奇数で判断して-1してみました。
(define (product term a next b) (if (> a b) 1.0 (* (term a) (product term (next a) next b)))) (define (factorial n) (define (f m) (/ (if (even? m) m (- m 1)) (if (even? m) (- m 1) m))) (product f 3 inc (+ n 3))) (* 4 (factorial 1000))
普通は2からやるのかも。1000回くらいやらないとまともな値にならない。
後は類題なので、ソースは略です。案外簡単だった。
1.33は問題の意味がわからない。パスするかな・・・。