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は問題の意味がわからない。パスするかな・・・。