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

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

Просто введем проверку на то, что нижняя и верхняя границы интервала-делителя не равны нулю и одного знака. Самый краткий способ записать это – сравнить произведение границ интервала с нулем (в случае положительного результата деление на интервал допустимо). Процедура div-interval с проверкой выглядит так:

(define (div-interval x y)
  (if (<= (* (lower-bound y) (upper-bound y)) 0)
      (error "Division by interval that spans zero" y)
      (mul-interval x
                    (make-interval (/ 1.0 (upper-bound y))
                                   (/ 1.0 (lower-bound y))))))

Comments

Comment from Rokker Ruslan
Date: February 6, 2014, 10:15 am

Одно из решений

(define (belong? item interval)
  (if (and (>= item (lower-bound interval))
           (<= item (upper-bound interval)))
      #t
      #f))

(define (contain-zero? interval)
  (belong? 0 interval))

(define (div-interval x y)
  (if (contain-zero? y)
      (error "divisor interval must not contain 0")
      (mul-interval x (make-interval (/ 1.0 (upper-bound y))
                                     (/ 1.0 (lower-bound y))))))

Comment from Irv
Date: January 23, 2016, 3:55 pm

вместо , поменяв then и else местами

(define (div x y)
  (let ((y1 (lower-bound y))
        (y2 (upper-bound y)))
    (if (> (* y1 y2) 0)
        (mul x (make-interval 
                (/ 1.0 y1) 
                (/ 1.0 y2)))
        (error "dividing an interval which contains zero" y))))

Write a comment