您的位置:首页 > 编程语言

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

2013-10-15 02:10 513 查看

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))))))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lisp sicp