計算機プログラムの構造と解釈 第二版 P53 問題2.8
この問題は、intervalどうしの差を求める。
- 手続きsub-internalを定義
んで、難しいのがどんな場合に、差は最小値、最大値になるのか?
どういう組み合わせがあるか考えてみる。
大 - 大
小 - 小
大 - 小
小 - 大
この四つの中から考える。
んー。
仮に以下のようなintervalを考えると、
(12 . 20)
(3 . 5)
具体的に
大 - 大 : 15
小 - 小 : 9
大 - 小 : 17
小 - 大 : 7
なんか、
小 - 大
は7で最小になるね。
そんで、
大 - 小
は17で最大になる。
だので、あとは実装あるのみ。
#!/usr/local/bin/gosh ;; -*- coding: utf-8 -*- (use ggc.debug.trace) (use math.mt-random) ;;P53 ;;和 (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) (mul-interval x (make-interval (/ 1.0 (upper-bound y)) (/ 1.0 (lower-bound y))))) ;;問題2-7 (define (make-interval a b) (cons a b)) (define upper-bound cdr) (define lower-bound car) ;;問題2-8 ;;差 (define (sub-interval x y) (make-interval (- (lower-bound x) (upper-bound y)) (- (upper-bound x) (lower-bound y)))) (define interval1 (make-interval 12 20)) (define interval2 (make-interval 3 5)) (define interval-sub (sub-interval interval1 interval2)) ;; main (define (main args) (newline) (display "interval1:") (display interval1)(newline) (display "interval2:") (display interval2)(newline) (display "(lower-bound interval-sub): ") (display (lower-bound interval-sub))(newline) (display "(upper-bound interval-sub): ") (display (upper-bound interval-sub))(newline) (newline) 0)
そんで、実行
interval1:(12 . 20) interval2:(3 . 5) (lower-bound interval-sub): 7 (upper-bound interval-sub): 17