`
zhangle
  • 浏览: 25961 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

sicp 习题 2.1 ~ 2.5

    博客分类:
  • SICP
阅读更多
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)
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics