Оператор and не работает? - Lisp
Формулировка задачи:
Предикат (> x y) истинен, если x больше y. Опишите с помощью предиката > и условного предложения функцию, которая возвращает из трех числовых аргументов значение среднего по велечине числа:
пишу
(среднее 4 7 6)
==> 6
(defun srav (x y z) (cond (and (> x y) (> x z) (> y z) z) (and (> x y) (> x z) (> z y) z) (and (> y z) (> y x) (> x z) x)))
==> SRAV
(srav 4 5 6)
Error in COND [or a callee]: The variable AND is unbound.
Решение задачи: «Оператор and не работает?»
textual
Листинг программы
(define (max x y) (if (> x y) x y)) (define (min x y) (if (< x y) x y)) (define (average x y z) (max (max (min x y) (min x z)) (max (min y x) (min y z)))) (define (also-average x y z) (define (f a b c) (max (min a b) (min a c))) (max (f x y z) (f y x z))) (display "average\n") (average 1 2 3) (average 2 3 1) (average 3 1 2) (average 1 3 2) (average 3 2 1) (average 2 1 3) (display "also-average\n") (also-average 1 2 3) (also-average 2 3 1) (also-average 3 1 2) (also-average 1 3 2) (also-average 3 2 1) (also-average 2 1 3)
Объяснение кода листинга программы
В данном коде написаны две функции для нахождения среднего значения:
- (define (average x y z) (max (max (min x y) (min x z)) (max (min y x) (min y z))))
- (define (also-average x y z) (define (f a b c) (max (min a b) (min a c))) (max (f x y z) (f y x z))) Первая функция находит среднее значение трех чисел, используя принцип «наибольшего общего делителя» (НОД). Вторая функция сначала определяет вспомогательную функцию f, которая находит наименьшее значение из трех чисел, а затем использует ее для нахождения среднего значения трех чисел. Далее, выводятся на экран две строки с названиями функций и вызываются эти функции с различными аргументами.