sicp习题答案和范例代码 - 第二章 2.1

2.1.1 范例 2.1 习题

(define (make-rat n d)
		       (cond ((< 0 (* n d)) (cons (abs n) (abs d)))
			     ((= 0 d) "divides 0")
			     (else (cons (- (abs n)) (abs d)))))
(define (numer x) (car x))
(define (denom x) (cdr x))
(define (print-rat x)
		       (display (numer x))
		       (display "/")
		       (display (denom x))
		       (newline))
 (define (add-rat x y)
		       (make-rat
			 (+ (* (numer x) (denom y)) (* (denom x) (numer y)))
			 (* (denom x) (denom y))))


(define (sub-rat x y)
		       (make-rat
			(- (* (numer x) (denom y)) (* (denom x) (numer y)))
			(* (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))
			  (* (denom x) (numer y))))



练习2.2

;; 2.2
(define (make-segment p1 p2)
		       (cons p1 p2))
(define (start-segment s)
		       (car s))
(define (end-segment s)
		       (cdr s))
(define (make-point x y)
		       (cons x y))
(define (x-point p)
		       (car p))
(define (y-point p)
		       (cdr p))
(define (midpoint-segment s)
		       (make-point (/ (+ (x-point (start-segment s))
					 (x-point (end-segment s))) 2)
				   (/ (+ (y-point (start-segment s))
					 (y-point (end-segment s))) 2)))
(define (print-point p)
		       (newline)
		       (display "(")
		       (display (x-point p))
		       (display ",")
		       (display (y-point p))
		       (display ")"))



练习2.3

;; 2.3
(define (make-rect h w)
			    (cons h w))
(define (width-rect r)
		       (cdr r))
(define (height-rect r)
		       (car r))
(define (peri-rect r)
		       (* (+ (length-segment h) (length-segment w)) 2))
(define (area-rect r)
		       (* (length-segment (height-rect r))
			  (length-segment (width-rect r))))
(define (square x)
		       (let ((v x))
			 (* v v)))
(define (length-segment s)
		       (let ((x1 (x-point (start-segment s)))
			     (y1 (y-point (start-segment s)))
			     (x2 (x-point (end-segment s)))
			     (y2 (y-point (end-segment s))))
			 (sqrt (+
				(square (- x1 x2))
				(square (- y1 y2))))))
;; test case
(define h (make-segment (make-point 0 0) (make-point 5 0)))
(define w (make-segment (make-point 0 0) (make-point 0 4)))
(define r  (make-rect h w))
(area-rect r)
(peri-rect r)

;; another design
(define (make-rect p1 p2)
               (cons p1 p2))
(define (height-rect r)
               (make-segment (car r) (make-point (x-point (car r))
                             (y-point (cdr r)))))
(define (width-rect r)
               (make-segment (car r) (make-point (x-point (cdr r))
                             (y-point (car r)))))
;; test case
(define r1 (make-rect (make-point 0 0) (make-point 4 5)))
(area-rect r1)
(peri-rect r1




范例 2.1.3

(define (our-cons x y)
		       (define (dispatch m)
			 (cond ((= m 0) x)
			       ((= m 1) y)
			       (else (error "Argument not 0 or 1 -- OUR-CONS" m))))
		       dispatch)

(define (our-car z) (z 0))
(define (our-cdr z) (z 1))

练习2.4

(define (cdr1 z)
		       (z (lambda (p q) q)))

练习2.5

(define (cons2 a b)
		       (* (expt 2 a) (expt 3 b)))
(define (car2 z)
		       (define (rec z c)
			 (if (not (= (remainder z 2) 0))
			     c
			     (rec (/ z 2) (1+ c))))
		       (rec z 0))
(define (cdr2 z)
		       (define (rec z c)
			 (if (not (= (remainder z 3) 0))
			     c
			     (rec (/ z 3) (1+ c))))
		       (rec z 0))


练习2.6


(define (one)
		       (lambda (f) (lambda(x) (f x))))

(define (two)
		       (lambda (f) (lambda(x) (f (f x)))))

(define (add n m)
               (lambda (f) (lambda (x) (lambda (n) (n f (lambda (m) m f))))))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值