計算機プログラムの構造と解釈[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