計算機プログラムの構造と解釈 第二版 P49 問題2.1
とうとう二章突入ですね。
この問題は分数の符号を扱う問題。
題意としては
・make-ratという手続きをつくる。
make-ratは分母がマイナスの時、分母をマイナスのままにしないで、
分子をマイナスにしてやると言う感じ。
まーそんな感じでわりかし単純な問題です。
以下に実装
#!/usr/local/bin/gosh ;; -*- coding: utf-8 -*- (use ggc.debug.trace) (use math.mt-random) (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 (- (* (number x) (denom y)) (* (number 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))) (if (< d 0) (cons (/ (- n) g) (/ (- d) g)) (cons (/ n g) (/ d g))))) (define (numer x) (car x)) (define (denom x) (cdr x)) (define (print-rat x) (display (numer x)) (display "/") (display (denom x))) ;;解答を確認するための定義 (define one-half (make-rat 1 -2)) (define one-third (make-rat -1 3)) (define one-forth (make-rat -1 -4)) (define one-fifth (make-rat 1 5)) ;; main (define (main args) (display "(print-rat one-half) : ") (print-rat one-half) (newline) (display "(print-rat one-third) : ") (print-rat one-third) (newline) (display "(print-rat one-forth) : ") (print-rat one-forth) (newline) (display "(print-rat one-fifth) : ") (print-rat one-fifth) (newline) 0)
実行!
(print-rat one-half) : -1/2 (print-rat one-third) : -1/3 (print-rat one-forth) : 1/4 (print-rat one-fifth) : 1/5
cool!!
自画自賛