Я решаю некоторые проблемы из Структура и интерпретация компьютерных программ
Мой случай выводит #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, поэтому я предполагаю, что это означает, что что-то не так? Как я могу исправить этот код, чтобы он возвращал середину, используя условные выражения?
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 элементов.
Я понял, что передаю 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)
))
))
Похожие вопросы
Новые вопросы
scheme
Scheme - это функциональный язык программирования в семействе Lisp, тесно смоделированный на основе лямбда-исчисления с активным (аппликативным порядком) вычислением. ПО ВОПРОСАМ о схемах URL ПОЖАЛУЙСТА, используйте тег "URL-схема".