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)))))
(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)))))