|
|
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) |
|