読者です 読者をやめる 読者になる 読者になる

Arantium Maestum

プログラミング、囲碁、読書の話題

SICPの勉強 問題2.1

Clojure SICP

有理数のデータタイプがマイナスな場合は分子の方に必ず負号がくるように修正する。

まずは元のmake-rat関数をclojureで書く:

(defn gcd [a b]
  (let [c (rem a b)]
    (if (zero? c)
      b
      (recur b c))))

(defn make-rat [n d]
  (let [g  (gcd n d)]
    [(/ n g) (/ d g)]))

consではなくてそのままベクトル書き。まあここの実装はどうでもいい、というのは作者たちも言っていることだし。

以下が修正したもの:

(defn make-rat [n d]
  (let [g  (gcd n d)
        n1 (/ n g)
        d1 (/ d g)
        m  (/ d1 (Math/abs d1))]
    [(* n1 m) (* d1 m)]))

とりあえず必ず分母が自然数になるようにした。