diff options
| author | Steve Lee <me@xiangyangli.com> | 2016-10-25 01:46:39 +0800 |
|---|---|---|
| committer | Steve Lee <me@xiangyangli.com> | 2016-10-25 01:46:39 +0800 |
| commit | 527c65ca2e4ec5095171345502dfa38a18e97a7f (patch) | |
| tree | 4b7bf522071fa60aef1eda3cc3fa81c62bfd0643 /SICP/ex2_7.scm | |
| parent | 9f3c370ed0af17c0b603847143ca9fbdf25536e7 (diff) | |
| download | Personal-527c65ca2e4ec5095171345502dfa38a18e97a7f.tar.xz Personal-527c65ca2e4ec5095171345502dfa38a18e97a7f.zip | |
add SICP exercise solutions
Diffstat (limited to 'SICP/ex2_7.scm')
| -rw-r--r-- | SICP/ex2_7.scm | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/SICP/ex2_7.scm b/SICP/ex2_7.scm new file mode 100644 index 0000000..54e8b70 --- /dev/null +++ b/SICP/ex2_7.scm @@ -0,0 +1,90 @@ +;; 2.1.4 Extended Exercise:Interval Arithmetic + +(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)))) + +;; Todo:ensure this is right +(define (div-interval x y) + (if (>= 0 (* (lower-bound y) (upper-bound y))) + (error "error!" y) + (mul-interval x + (make-interval + (/ 1.0 (upper-bound y)) + (/ 1.0 (lower-bound y)))))) + +(define (make-interval a b) (cons a b)) + +;; Exercise:2.7 + +;; My version +;; (define (lower-bound interval) (car interval)) +;; (define (upper-bound interval) (cdr interval)) + +(define (lower-bound interval) (min (car interval) + (cdr interval))) +(define (upper-bound interval) (max (car interval) + (cdr interval))) + +;; ??? +;; Exercise:2.8 +(define (sub-interval x y) + (make-interval (- (lower-bound x) (upper-bound y)) + (- (upper-bound x) (lower-bound y)))) + +(define (display-interval i) + (newline) + (display "[") + (display (lower-bound i)) + (display ",") + (display (upper-bound i)) + (display "]")) + +(define i (make-interval 1 5)) +(define j (make-interval 1 4)) + +(display-interval i) +(display-interval (sub-interval i j)) +(display-interval (sub-interval j i)) + +;; Exercise:2.9 + +(define (interval-width i) + (/ (- (upper-bound i) (lower-bound i)) + 2)) + +(interval-width (make-interval 2 8)) + +;; Exercise:2.10 + +(define (div-interval x y) + (if (>= 0 (* (lower-bound y) (upper-bound y))) + (error "error!" y) + (mul-interval x + (make-interval + (/ 1.0 (upper-bound y)) + (/ 1.0 (lower-bound y)))))) + +(define (make-interval a b) (cons a b)) + +(define span-0 (make-interval -1 2)) + +(display-interval (div-interval i j)) +(display-interval (div-interval i span-0)) + +;; Exercise:2.11 + |
