zhangle 发表于 2013-1-27 04:55:26

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]
查看完整版本: sicp 习题 2.1 ~ 2.5