六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 50|回复: 0

sicp 习题 2.1 ~ 2.5

[复制链接]

升级  80%

8

主题

8

主题

8

主题

童生

Rank: 1

积分
40
 楼主| 发表于 2013-1-27 04:55:26 | 显示全部楼层 |阅读模式
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)
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表