sicpm2.1〜m2.6
(実際に更新したのは、28にちです)
問題2.6が分かりませんでした。><
;;復習 ;repeated (define (repeated f n) (if (= n 1) f ((lambda (f g) (lambda (x) (f (g x)))) f (repeated f (- n 1))))) ;m1.46 (define (sqrt x) (fixed-point (lambda (y) (/ (+ y (/ x y) ) 2)) 1.0)) ;!use average-dump (define (fixed-point f first-guess) (define (good-enough? guess) (< (abs (- guess (f guess))) tolerance)) ((iterative-improve good-enough? f) first-guess)) (define tolerance 0.00001) (define (iterative-improve ok? f) (lambda (guess) (define (iter guess) (if (ok? guess) guess (iter (f guess)))) (iter guess))) ;;できた。(iterative-improveは少し悩んだ。) ;!gosh> (sqrt 3) ;!1.7320508100147274 ;!gosh> ((repeated (lambda (x) (* x x)) 2) 3) ;!81 ;;m2.1.1めんどそうな*-ratは飛ばす。 (define x (cons 1 2)) ;!(car x) ;=> 1 ;!(cdr x) ;=> 2 (define y (cons 3 4)) (define z (cons x y)) (define z (cons (cons 1 2) (cons 3 4))) ;!(car (car z)) ;=>1 ;!(cdr (car z)) ;=>3 ;;有理数の作成。 (define (make-rat n d) (cons n d)) (define (numer x) (car x)) (define (denom x) (cdr x)) (define (print-rat x) (display (numer x)) (display "/") (display (denom x))) ;;その実験 (define (f numer denom) (print-rat (make-rat numer denom))) ;!(f 4 6) ;=>4/6#<undef> ;!#<undef>の存在が謎。 ;約分をする (define (make-rat2 n d) (let ((g (gcd n d))) (cons (/ n g) (/ d g)))) ;;gcdははじめから存在した。(新たに定義しなくてもいい)。 ;;m2.1 (define (make-rat3 n d) (let ((g (abs (gcd n d)))) (if (positive? d) (cons (/ n g) (/ d g)) (cons (/ (- n) g) (/ (- d) g))))) ;; 1 2 1 2 ;;-1 2 -1 2 ;; 1 -2 -1 2 ;;-1 -2 1 2で考えた。 ;!gosh> (make-rat3 -3 4) ;!(-3 . 4) ;!gosh> (make-rat2 -2 -8) ;!(-1 . -4) ;;できてる。 ;;m2.2 (define (print-point p) (newline) (display "(" ) (display (x-point p)) (display ",") (display (y-point p)) (display ")" )) ;;こんな感じでいいのかな ;;ユーザー側は*-segment ;;実際に使われるのは*-point (define (make-segment start end) (make-point start end)) (define (start-segment p) (x-point p)) (define (end-segment p) (y-point p)) (define (make-point x y) (cons x y)) (define (x-point p) (car p)) (define (y-point p) (cdr p)) (define (midpoint-segment p) (/ (+ (x-point p) (y-point p)) 2)) ;;2.3 (define (rectangle height width) (cons height width)) (define (height-of-rectangle rec) (car rec)) (define (width-of-rectangle rec) (cdr rec)) ;;面積と周囲の長さ (define (area rec) (* (height-of-rectangle rec) (width-of-rectangle rec))) (define (perimeter rec) ((lambda (x y) (* 2 (+ x y))) (height-of-rectangle rec) (width-of-rectangle rec))) (define (check x y) (let (( r (rectangle x y))) (display "area is ") (display (area r)) (newline) (display "perimeter is ") (display (perimeter r)) (newline) )) ;;こんな感じで ;!gosh> (check 3 4) ;!area is 12 ;!perimeter is 14#<undef> ;;最後に表示される#<undef>が謎。 ;;途中の内容は、手続きが適切な条件を満たすなら中の実装を隠蔽できるということだと思う。 ;;m2.4 (define (cons2 x y) (lambda (m) (m x y))) (define (car2 z) (z (lambda (p q) p))) (define (cdr2 z) (z (lambda (p q) q))) ;;ちょー簡単。 ;!gosh> (car2 (cons2 3 4)) ;!3 ;!gosh> (cdr2 (cons2 3 4)) ;!4 ;;m2.5 ;;calc-pairを作ると楽、 ;;どんな名前を付ければいいかわからないなー (define (number a b) (* (expt a) (expt b))) (define (calc-pair num value count) (if (= (remainder num value) 0) (calc-pair (/ num value) value (+ count 1)) result)) (define (car num) (calc-pair num 2 0)) (define (cdr num) (calc-pair num 3 0)) ;;m2.6 ;;この問題でつまづいてしまいました>< ;;(明日また取り組みます><) (define (zero (lambdea (f) (lambda (x) x)))) (define (add-1 n) (lambda (f) (lambda (x) (f ((n f) x))))) ;zeroとadd-1から分析してみる。 ;!zero ;!(lf (lx x)) ;!(lf (x)) ;!(l x) ;!x (define (one x) (lambda (f) (lambda (x) (f x)))) ;!前のrepeatedが使えないかな? (define (repeated f n) (if (= n 1) f ((lambda (f g) (lambda (x) (f (g x)))) f (repeated f (- n 1))))) (define (two x) (repeated (lambda (f) lambda (x) (f x)) 2)) (define (inc x) (lambda (x) (+ 1 x))) ;;何かの引数をとれるような状態かな? ;!add-1 ;!(lf (lx (f ((n f) x)))) ;!(lf (lx (f (