Оператор 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)

Объяснение кода листинга программы

В данном коде написаны две функции для нахождения среднего значения:

  1. (define (average x y z) (max (max (min x y) (min x z)) (max (min y x) (min y z))))
  2. (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, которая находит наименьшее значение из трех чисел, а затем использует ее для нахождения среднего значения трех чисел. Далее, выводятся на экран две строки с названиями функций и вызываются эти функции с различными аргументами.

Оцени полезность:

13   голосов , оценка 3.846 из 5
Похожие ответы