SICP 2.7 ~ 2.12习题解答

(define (add-interval x y)
  (make-interval (+ (lower-bound x) (lower-bound y))
                 (+ (upper-bound x) (upper-bound y))))
(define (make-interval a b)
  (cons a b))
(define (lower-bound x)
  (cond ((> (car x) (cdr x)) (cdr x))
        (else (car x))))
(define (upper-bound y)
  (cond ((> (car y) (cdr y)) (car y))
        (else (cdr y))))
(define (sub-interval x y)
  (make-interval (- (lower-bound x) (upper-bound y))
                 (- (upper-bound x) (lower-bound y))))
(define (max a b c d)
  (define (max-helper x y)
    (cond ((< x y) y)
          (else x)))
  (let ((x (max-helper a b))
        (y (max-helper c d)))
    (cond ((< x y) y)
          (else x))))
(define (min a b c d)
  (define (min-helper x y)
    (cond ((< x y) x)
          (else y)))
  (let ((x (min-helper a b))
        (y (min-helper c d)))
    (cond ((< x y) x)
          (else y))))
(define (mul-interval x y)
  (let ((p1 (* (lower-bound x) (lower-bound y)))
        (p2 (* (lower-bound x) (upper-bound y)))
        (p3 (* (upper-bound x) (lower-bound y)))
        (p4 (* (upper-bound x) (upper-bound y))))
    (make-interval (min p1 p2 p3 p4) (max p1 p2 p3 p4))))
(define (div-interval x y)
  (let ((a (lower-bound y))
        (b (upper-bound y)))
    (cond ((<= (* a b) 0) (display "interval -> infinite"))
          (else (mul-interval x (make-interval (/ 1.0 b) (/ 1.0 a)))))))
(define (make-center-persent c p)
  (make-interval (- c (* c p)) (+ c (* c p))))
(define (center i)
  (/ (+ (lower-bound i) (upper-bound i)) 2))
(define (persent i)
  (/ (/ (- (upper-bound i) (lower-bound i)) 2) (abs (center i))))
(define (par1 r1 r2)
  (div-interval (mul-interval r1 r2)
                (add-interval r1 r2)))
(define (par2 r1 r2)
  (let ((one (make-interval 1 1)))
    (div-interval  one (add-interval (div-interval one r1) (div-interval one r2)))))
posted @ 2007-01-08 23:31  浅蓝の天   阅读(199)  评论(0编辑  收藏  举报