MIT OCW
Lecture 2B | MIT 6.001
本日の MIT ビデオは 2B の後半。
・抽象化レイヤ
・pair の pair を用いて、任意の大きさのデータブロックを定義できる
・cons/car/cdr を自前で用意
・データ的なものを関数を用いて表現する
問題解答
問2.11
(define (mul-interval x y)
(cond ((< 0 (lower-bound x)) (make-interval (* (lower-bound x) (lower-bound y))
(* (upper-bound x) (upper-bound y)))
((= (lower-bound x) 0) (make-interval 0
(* (upper-bound x) (upper-bound y))))
((< (lower-bound x) 0) (make-interval (* (lower-bound x) (upper-bound y))
(* (upper-bound x) (upper-bound y))))
((= (upper-bound x) 0) (make-interval (* (lower-bound x) (upper-bound y))
0))
((< (upper-bound x) 0) (make-interval (* (lower-bound x) (upper-bound y))
(* (upper-bound x) (lower-bound y))))
((= (lower-bound y) 0) (make-interval (* (lower-bound x) (upper-bound y))
0))
((< (lower-bound y) 0) (make-interval (* (lower-bound x) (upper-bound y))
(* (upper-bound x) (lower-bound y))))
((= (lower-bound y) 0) (make-interval 0
(* (lower-bound x) (lower-bound y))))
((= (lower-bound y) 0) (make-interval (* (upper-bound x) (lower-bound y))
(* (lower-bound x) (upper-bound y)))))))
9 つに場合分けすることはできたけれども、いずれかの値が 0 でない場合は常に二回乗算がおこなわれるような。。。?
→問題は"二回以上"だけど、正しくは"二回より多く"。また、場合分けの仕方がダメだった。
また、x と y の区間が被らない前提で考えてしまった。
本来なら xy それぞれについて
- 完全に負
- ゼロをまたぐ
- 完全に正
の、3×3通りについて考えないといけなかった。
問2.12
(define (make-center-percent v percent)
(make-interval (* v (- 1.0 (/ percent 100.0)))
(* v (+ 1.0 (/ percent 100.0)))))
(define (center i)
(/ (+ (lower-bound i) (upper-bound i)) 2))
(define (width i)
(/ (- (upper-bound i) (lower-bound i)) 2))
(define (percent i)
(* (/ (width i) (center i)) 100))
P54 は丸々問題なので時間がかかる。
それにしても、WordPress でタグを打ちながら記事を書くのがいい加減辛い、、、、
テーマも適当だし、いい加減もっと手軽なものに移行したい。