sicp 习题 2.1 ~ 2.5
2.1(define (make-rat n d)(let ((g (gcd n d))) (cond ((and (< n 0) (> d 0)) (cons (/ n g) (/ d g))) ((and (> n 0) (> d 0)) (cons (/ n g) (/ d g))) (else (cons (/ (- n) g) (/ (- d) g))) )))(define (numer x) (car x))(define (denom x) (cdr x))(define (print-rat x)(newline)(display (numer x))(display "/")(display (denom x)))(define (add-rat x y)(make-rat (+ (* (numer x) (denom y)) (* (numer y) (denom x))) (* (denom x) (denom y))))(define (sub-rat x y)(make-rat (- (* (numer x) (denom y)) (* (numer y) (denom x))) (* (denom x) (denom y))))(define (mul-rat x y)(make-rat (* (numer x) (numer y)) (* (denom x) (denom y))))(define (div-rat x y)(make-rat (* (numer x) (denom y)) (* (denom x) (numer y))))(define (equal-rat? x y)(= (* (numer x) (denom y)) (* (numer y) (denom x))))(define one-half (make-rat -1 -2))(print-rat one-half);;(define one-third (make-rat 1 3));;(print-rat (add-rat one-half one-third))
2.2
(define (average x y)(/ (+ x y) 2))(define (make-point x y) (cons x y))(define (x-point x) (car x))(define (y-point x) (cdr x))(define (print-point p)(newline)(display "(")(display (x-point p))(display ",")(display (y-point p))(display ")"))(define test-point (make-point 1 2))(print-point test-point)(define (make-segment start end) (cons start end))(define (start-segment segment)(car segment))(define (end-segment segment)(cdr segment))(define (midpoint-segment segment)(let ((x (average (car (car segment)) (car (cdr segment)))) (y (average (cdr (cdr segment)) (cdr (car segment))))) (make-point x y)))(define (print-segment s)(newline)(display "[")(print-point (car s))(display ",")(print-point (cdr s))(display "]"))(define start-point (make-point 1 2))(define end-point (make-point 3 4))(define one-segment (make-segment start-point end-point))(print-segment one-segment)(print-point (midpoint-segment one-segment))
2.3
(define (average x y)(/ (+ x y) 2))(define (square x)(* x x))(define (make-point x y) (cons x y))(define (x-point x) (car x))(define (y-point x) (cdr x))(define (print-point p)(newline)(display "(")(display (x-point p))(display ",")(display (y-point p))(display ")"))(define (make-segment start end) (cons start end))(define (start-point segment)(car segment))(define (end-point segment)(cdr segment))(define (make-rectangle segment1 segment2)(cons segment1 segment2))(define (segment-len segment)(sqrt (+ (square (- (x-point (start-point segment)) (x-point (end-point segment)))) (square (- (y-point (start-point segment)) (y-point (end-point segment)))))))(define (print-segment s)(newline)(display "[")(print-point (car s))(display ",")(print-point (cdr s))(display "]"))(define (make-rectangle segment1 segment2) (cons segment1 segment2))(define (rectangle-segment1 r) (car r))(define (rectangle-segment2 r) (cdr r))(define (rectangle-area rectangle)(* (segment-len (rectangle-segment1 rectangle)) (segment-len (rectangle-segment2 rectangle))))(define (rectangle-length rectangle)(* (+ (segment-len (rectangle-segment1 rectangle)) (segment-len (rectangle-segment2 rectangle)))))(define one-segment (make-segment (make-point 1 2) (make-point 3 2)))(define two-segment (make-segment (make-point 1 4) (make-point 3 4)))(display (segment-len one-segment))(newline)(display (segment-len two-segment))(newline)(define one-rectangle (make-rectangle one-segment two-segment))(display (rectangle-area one-rectangle))(newline)(display (rectangle-length one-rectangle))
2.4
(define (my-cons x y)(lambda (m) (m x y)))(define (my-car z)(z (lambda (p q) p)))(define (my-cdr z)(z (lambda (p q) q)))(define point (my-cons 1 2))(my-car point)(my-cdr point)
2.5
(define (power n m)(if (= m 1) n (* n (power n (- m 1)))))(define (my-cons x y)(* (power 2 x) (power 3 y)))(define (my-car c)(define (iter c result) (if (= (remainder c 2) 0) (iter (/ c 2) (+ result 1)) result))(iter c 0))(define (my-cdr c)(define (iter c result) (if (= (remainder c 3) 0) (iter (/ c 3) (+ result 1)) result))(iter c 0))(define c (my-cons 3 2))(my-car c)(my-cdr c)
页:
[1]