Я решаю некоторые проблемы из Структура и интерпретация компьютерных программ

Мой случай выводит #f как действительный результат в интерпретаторе repl.it. Я подаю заявку (и (не (max a b c)) (не (min a b c))), чтобы получить среднее значение.

Я попытался переставить значения для средней функции. Функции max и min работают нормально.

(define (max a b c) 
(cond 
  ((and(>= a b)(>= a c)) a)
  ((and(>= b a)(>= b c)) b)
  ((and(>= c a)(>= c b)) c)
))

(define (min a b c) 
(cond 
  ((and(<= a b)(<= a c)) a)
  ((and(<= b a)(<= b c)) b)
  ((and(<= c a)(<= c b)) c)
))

(define (mid a b c)
(and 
  (not (max a b c)) 
  (not (min a b c))
))

(mid 10 8 6)

Вывод в интерпретаторе схемы repl.it:

=> #f

Я ожидаю ошибку какого-то рода или числовое значение, но этот код возвращает зеленый #f, поэтому я предполагаю, что это означает, что что-то не так? Как я могу исправить этот код, чтобы он возвращал середину, используя условные выражения?

0
lucky 15 Авг 2019 в 06:28

2 ответа

Лучший ответ

Я думаю, что стоит подумать о том, сколько тестов вам нужно сделать, чтобы вычислить эти вещи: чтобы вычислить экстремум трех элементов под любым оператором упорядочения, вам нужно выполнить не более трех сравнений:

(define (extremum/3 ordered? a b c)
  ;; find the extremum of three elements under ordered?
  (cond ((and (ordered? a b) (ordered? a c)) a)
        ((ordered? b c) b)
        (else c)))

И с учетом этой общей функции теперь вы можете легко определить max / 3 и min / 3:

(define (max/3 a b c)
  (extremum/3 >= a b c))

(define (min/3 a b c)
  (extremum/3 <= a b c))

Вычисление средней точки трех элементов также требует не более трех тестов:

(define (mid/3 a b c)
  (if (>= a b)
      (if (>= a c)
          ;; a is greatest, so we need to pick b or c
          (if (>= b c) b c)
          ;; a is the mid point
          a)
      (if (>= a c)
          ;; a is the mid point
          a
          ;; a is the minimum, pick b or c
          (if (>= c b) b c))))

Интересно рассмотреть, сколько сравнений вам нужно, чтобы найти середину из n элементов.

0
tfb 15 Авг 2019 в 12:55

Я понял, что передаю NOT from max AND min, поэтому он каждый раз оценивал false, поскольку в этих выражениях всегда есть ложный результат. Я продолжил использовать сравнения, чтобы получить правильное решение, и откорректировал исключения, приняв среднее значение, которое будет повторяться три или два раза, если оно не меньше max или больше min. Единственное, что тревожит, - это то, что мне пришлось по существу выразить все условия, которые действительны для выделения среднего числа, и я не мог явно определить середину как НЕ максимальное число И НЕ минимальное число. При этом должен быть лучший способ сократить эти функции и устранить большую часть сравнений ...

(define (mid a b c) 
(cond 
  ((and(< a (max a b c))(> a (min a b c))) a)
  ((and(< b (max a b c))(> b (min a b c))) b)
  ((and(< c (max a b c))(> c (min a b c))) c)
  (else (cond
    ((= (min a b c) (max a b c)) a)
    ((= a b) a)
    ((= a c) a)
    ((= b c) b)
))
))
0
lucky 16 Авг 2019 в 03:19