首页 > 代码库 > SICP 1.29 1.30

SICP 1.29 1.30

解:代码如下

(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a) (sum term (next a) next b))))

(define (add-1 x)
  (+ x 1))

(define (sum-iter term a next b)
  (define (iter a result)
    (if (> a b)
        result
        (iter (next a) (+ result (term a)))))
  (iter a 0))

(define (integral f a b n)
  (define h (/ (- b a) (* 1.0 n)))
  (define (function-y k)
    (f (+ a (* k h))))
  (define (term k)
    (define y (function-y k))
    (cond ((= k 0) y)
          ((= k n) y)
          ((even? k) (* 2 y))
          (else (* 4 y))))
  (* (/ h 3) (sum-iter term 0 add-1 n)))

(define (cube x)
  (* x x x))

1.29的难点是找出状态转移变量,也就是k;要注意的时k=0和k=n时,y函数前面是没有2或4的。

当n=1000时,用sum求出的是0.25000000000000003,而用sum-iter求出的是0.25000000000000006,用DrRacket,不知道为什么。