SICP_2.7-2.11

本文介绍了使用Scheme语言实现的一系列区间运算,包括加法、减法、乘法和除法等基本运算,并详细展示了每种运算的具体实现过程及部分特殊情况的处理方式。


(define (make-interval x y)
  (cons x y))

(define (add-interval x y)
  (make-interval (+ (lower-bound x) (lower-bound y))
                (+ (upper-bound x) (upper-bound y))))

;;;;;;;;;;;;;;;2.7
(define (upper-bound inter)
  (cdr inter))

(define (lower-bound inter)
  (car inter))
;;;;;;;;;;;;;;2.8
(define (sub-interval x y)
  (add-interval x
                (make-interval (- (upper-bound y))
                              (- (lower-bound y)))))

;;;;;;;;;;;;;;2.9
(define (width-interval x)
  (/ (- (upper-bound x) (lower-bound x)) 2))

;(width-interval (add-interval x y)) (1)
;(width-interval (sub-interval x y))  (2)
;(+ (width-interval x) (width-interval y)) (3)
;(- (width-interval x) (width-interval y)) (4)
;
;(1) (3)是等价的
;(width-interval (mul-interval x y)) (5)
;(* (width-interval x) (width-interval y)) (6)
;(5) (6) 不等价

;;;;;;;;;;;2.10
(define (div-interval x y)
  (if (< (* (upper-bound y) (lower-bound y)) 0)
      (error "division interval isn't right")
      (mul-interval x
                    (make-interval (/ 1.0 (upper-bound y))
                                   (/ 1.0 (lower-bound y))))))

;;;;;;;;;2.11
(define (mul-interval x y)
  (let ((xl (lower-bound x))
        (xu (upper-bound x))
        (yu (upper-bound y))
        (yl (lower-bound y)))
    (cond ((and (< xl 0) (< xu 0)) (cond ((and (< yl 0) (< yu 0))
                                          (make-interval
                                           (* xu yu) (* xl yl)))
                                          ((and (< yl 0) (> yu 0))
                                          (make-interval
                                           (* xl yu) (* xl yl)))
                                          ((and (> yl 0) (> yu 0))
                                          (make-interval
                                           (* xl yu) (* xu yl)))))
          ((and (< xl 0) (> xu 0)) (cond ((and (< yl 0) (< yu 0))
                                          (make-interval
                                           (* xu yl) (* xl yl)))
                                         ((and (< yl 0) (> yu 0))
                                          (make-interval
                                           (* xl yu) (* xu yu)))
                                         ((and (> yl 0) (> yu 0))
                                          (make-interval
                                           (* xl yu) (* xu yu)))))
          ((and (> xl 0) (> xu 0)) (cond ((and (< yl 0) (< yu 0))
                                          (make-interval
                                           (* xu yl) (* xl yu)))
                                         ((and (< yl 0) (> yu 0))
                                          (make-interval
                                           (* xu yl) (* xu yu)))
                                         ((and (> yl 0) (> yu 0))
(make-interval (
* xl yl) (* xu yu))))))) ;;;;;;;;;;;;;;;改成这种形式可能是因为当乘法代价比较高时 ;;;;;;;;;;;;;;;可以提高效率

 

转载于:https://www.cnblogs.com/tclan126/p/6379366.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值