Решение упражнения 2.1 из SICP

16 January, 2008 (21:49) | Решения упражнений

Во-первых, хочу предупредить, что в русском издании (по крайней мере, в моей версии) есть опечатка в условии этого упражнения. На самом деле требуется определить улучшенную версию процедуры make-rat, а не mul-rat. Для этого нам всего лишь необходимо дополнительно разделить числитель и знаменатель на знак знаменателя. На всякий случай, есть смысл при вычислении наибольшего общего делителя вычислять его для модулей числителя и знаменателя, так как НОД определен для неотрицательных чисел.

(define (sign x)
  (cond ((> x 0) 1)
        ((< x 0) -1)
        (else 0)))
(define (make-rat n d)
  (let ((g (* (gcd (abs n) (abs d)) (sign d))))
    (cons (/ n g) (/ d g))))

Comments

Comment from meduza
Date: October 22, 2008, 4:57 pm

У меня прокатывает и такой вариант, gcd работает.

(define (make-rat n d)
(let ((g ((if (negative? d) - +) (gcd n d))))
(cons (/ n g) (/ d g))))

Comment from vovka
Date: March 22, 2010, 5:34 pm

to автор
хм, а если и числитель и знаменатель отрицательны выдает положительное число, так (dr (make-rat2 -6 -9))
выдаст 2/3

Write a comment