SICP 习题2.11 改写div-interval 分情况讨论

来源:互联网 发布:淘宝买电脑主机 编辑:程序博客网 时间:2024/06/01 09:53

xy

3*3总共有9种情况,分类讨论即可。

div-interval的代码

(define (div-interval x y)  (let ((x1 (lower-bound x))    (y1 (upper-bound x))    (x2 (/ 1 (lower-bound y)))    (y2 (/ 1 (upper-bound y))))    (cond ((and (> x2 0) (> y2 0))        (cond ((and (> x1 0) (> y1 0))           (make-interval (* x1 y2) (* y1 x2)))         ((and (> x1 0) (< y1 0))          (make-interval (* y1 x2) (* x1 x2)))         ((and (< x1 0) (< y1 0))          (make-interval (* x1 x2) (* y1 y2)))))      ((and (< x2 0) (< y2 0))       (cond ((and (> x1 0) (> y1 0))           (make-interval (* x1 x2) (* y1 y2)))         ((and (> x1 0) (< y1 0))          (make-interval (* x1 y2) (* y1 y2)))         ((and (< x1 0) (< y1 0))          (make-interval (* y1 x2) (* x1 y2)))))      (else out-error))))

整个程序的代码

(define (add-interval x y)  (make-interval (+ (lower-bound x) (lower-bound y))         (+ (upper-bound x) (upper-bound 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 ((x1 (lower-bound x))    (y1 (upper-bound x))    (x2 (/ 1 (lower-bound y)))    (y2 (/ 1 (upper-bound y))))    (cond ((and (> x2 0) (> y2 0))        (cond ((and (> x1 0) (> y1 0))           (make-interval (* x1 y2) (* y1 x2)))         ((and (> x1 0) (< y1 0))          (make-interval (* y1 x2) (* x1 x2)))         ((and (< x1 0) (< y1 0))          (make-interval (* x1 x2) (* y1 y2)))))      ((and (< x2 0) (< y2 0))       (cond ((and (> x1 0) (> y1 0))           (make-interval (* x1 x2) (* y1 y2)))         ((and (> x1 0) (< y1 0))          (make-interval (* x1 y2) (* y1 y2)))         ((and (< x1 0) (< y1 0))          (make-interval (* y1 x2) (* x1 y2)))))      (else out-error))))(define (out-error)  (newline)  (display "ERROR"))(define (sub-interval x y)  (make-interval (- (lower-bound x) (upper-bound y))         (- (upper-bound x) (lower-bound y))))(define (width-interval z)  (/ (- (upper-bound z) (lower-bound z)) 2.0))(define make-interval cons)(define lower-bound car)(define upper-bound cdr)(define print-interval  (lambda (z)    (newline)    (display (lower-bound z))    (display " ~ ")    (display (upper-bound z))))(define a (make-interval 1 2))(define b (make-interval 3 4))(newline)(display "a : ")(display (width-interval a))(newline)(display "b : ")(display (width-interval b))(print-interval (add-interval a b))(newline)(display "add : ")(display (width-interval (add-interval a b)))(print-interval (mul-interval a b))(newline)(display "mul : ")(display (width-interval (mul-interval a b)))(print-interval (div-interval a b))(newline)(display "div : ")(display (width-interval (div-interval a b)))(print-interval (sub-interval a b))(newline)(display "sub : ")(display (width-interval (sub-interval a b)))(define c (make-interval -1 2))(div-interval a c)
0 0
原创粉丝点击