;; gcd from s1.2.5

(define (gcd a b)
  (if (= b 0)
      a
      (gcd b (remainder a b))))



(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 (make-rat n d)
  (let [(g (gcd n d))]
    (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)))


;; p2.2
(define (make-segment x y)
  (cons x y))
(define (start-segment x)
  (car x))
(define (end-segment x)
  (cdr x))

(define (make-point x y)
  (cons x y))
(define (x-point x)
  (car x))
(define (y-point y)
  (cdr y))

(define (midpoint-segment seg)
  (let [(beg (start-segment seg))
        (end (end-segment seg))]
    (make-point
     (/ (+ (x-point beg)
           (x-point end))
        2.0)
     (/ (+ (y-point beg)
           (y-point end))
        2.0))))

(define (print-point p)
  (newline)
  (display "(")
  (display (x-point p))
  (display ",")
  (display (y-point p))
  (display ")"))


;; p2.4
(define (y-cons x y)
  (lambda (m) (m x y)))
(define (y-car z)
  (z (lambda (p q) p)))
(define (y-cdr z)
  (z (lambda (p q) q)))


;; p2.6
(define zero
  (lambda (f) (lambda (x) x)))
(define (add-1 n)
  (lambda (f)
    (lambda (x)
      (f ((n f) x)))))
(define one
  (lambda (f)
    (lambda (x)
      (f x))))
(define two
  (lambda (f)
    (lambda (x)
      (f (f x)))))
(define (add a b)
  (lambda (f)
    (lambda (x)
      ((a f) ((b f) x)))))


 ;; p2.7
(define (make-interval a b)
  (cons a b))
(define (upper-bound val)
  (cdr val))
(define (lower-bound val)
  (car val))

(define (sub-interval x y)
  (let ([p1 (- (lower-bound x) (lower-bound y))]
        [p2 (- (lower-bound y) (lower-bound x))]
        [p3 (- (upper-bound x) (upper-bound y))]
        [p4 (- (upper-bound y) (upper-bound x))])
    (make-interval (min p1 p2)
                   (max p3 p4))))

 

Posted on 2013-05-04 11:57  ASOCS  阅读(130)  评论(0编辑  收藏  举报