Не могу понять ошибку - Lisp
Формулировка задачи:
(defun SRA (st) ;sr. arifm.
(setq sr 0)
(setq out 0)
(setq i 0)
(dolist (el st out)
(setq i (+ i 1))
(setq out (+ out el))
)
(setq sr (/ out i))
)
(defun ZZ(x) ;
(setq x (* x -1))
)
#|smena znaka +/- esli abs el-ta > sr. arifm.|#
(defun usl2(sp)
(setq dopst())
(dolist (el sp dopst)
(cond ((> (abs el) (SRA(sp))) ;true
(cons (ZZ(el)) dopst)
)
(t ;else
(cons el dopst)
)
)
)
(setq sp dopsp)
)
(usl2 '(2 4 6 8)); ne pashet =\Решение задачи: «Не могу понять ошибку»
textual
Листинг программы
(defun abs-average (w &aux (m (float (/ (reduce #'+ w) (length w))))) (loop for a in w collect (if (> (abs a) m) (* a -1) a))) > (abs-average '(1 2 3 4)) (1 2 -3 -4)
Объяснение кода листинга программы
В этом коде функция abs-average вычисляет среднее арифметическое элементов вектора w, которые больше среднего значения m.
Список выражений в коде:
(defun abs-average (w &aux (m (float (/ (reduce #'+ w) (length w)))))- Создает функцию
abs-average, которая принимает аргументwи вспомогательную переменнуюm. mинициализируется как среднее значение элементов вектораw, используя функциюreduceдля суммирования всех элементов вектораwи деления на длину вектора.
- Создает функцию
- `(loop for a in w collect (if (> (abs a) m) (* a -1) a))]
- Начинает цикл
loopдля каждого элементаaв вектореw. - Если
abs(a)большеm, то элемент умножается на -1. - Все элементы, удовлетворяющие условию, собираются в новый вектор.
- Начинает цикл
> (abs-average '(1 2 3 4))- Вызывает функцию
abs-averageс аргументом'(1 2 3 4). - Результатом будет
(1 2 -3 -4).
- Вызывает функцию