計算機プログラムの構造と解釈[13]

今日から2章.

2.1


まず準備

(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) (cons n d))
(define (numer x) (car x))
(define (denom x) (cdr x))

(define (print-rat x)
  (newline)
  (display (numer x))
  (display "/")
  (display (denom x)))

(define one-helf (make-rat 1 2))
(define one-third (make-rat 1 3))

(define (gcd a b)
  (if (= b 0)
      a
      (gcd b (remainder a b))))
(define (make-rat n d)
  (let ((g (gcd n d)))
    (cons (/ n g) (/ d g))))

分数を扱うもの. car, cdr, cons が登場.

問題 2.1

この make-rat を正負両方扱えるようにする.
こんな感じかな.

(define (make-rat n d)
  (let ((g (gcd (abs n) (abs d))))
    (if (> (* n d) 0)
        (cons (/ (abs n) g) (/ (abs d) g))
        (cons (- (/ (abs n) g)) (/ (abs d) g)))))

(abs n) や (abs d) は, 局所変数として方が良かったかも.
実行結果.

gosh> (make-rat 1 1)
(1 . 1)
gosh> (make-rat -1 1)
(-1 . 1)
gosh> (make-rat 1 -1)
(-1 . 1)
gosh> (make-rat -1 -1)
(1 . 1)

OK かな.

更新時刻

2007年, 4月6日, 1:32