Не могу понять ошибку - 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)
.
- Вызывает функцию
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д