Среднее арифметическое отрицательных чисел произвольного списка - Lisp
Формулировка задачи:
Добрый вечер.Нужно вычислить среднее арифметическое отрицательных чисел произвольного списка.
Есть НЕ рабочий код, который нужно ИЗМЕНИТЬ, чтобы он заработал и использовал apply
Заранее Спасибо
(defun f1 (mylist) (f (ff mylist)) (defun ff (mylist) (cond ((Null mylist) (cons 0 0)) ((listp (car mylist)) (mapcon #'fun (ff (car mylist)) (ff (cdr mylist)))) ((minusp (car mylist)) (mapcon #'fun (cons (car mylist) 1) (ff (cdr mylist)))) ((ff (cdr mylist))) ) (defun fun (mylistl mylist2) (cons (+ (car mylistl) (car mylist2)) (+ (cdr mylistl) (cdr mylist2))) (defun f (mylist) (cond ((> (cdr mylist) 0) (/ (car mylist) (cdr mylist))) (0) )
Решение задачи: «Среднее арифметическое отрицательных чисел произвольного списка»
textual
Листинг программы
(defun task (lst) (let* ((ml (remove-if-not #'minusp lst)) (ll (length ml)) (sl (apply '+ ml))) (if (zerop ll) "Отрицательных элементов нет!" (/ sl ll)))) ==> task (task '(1 2 -6 7 -7 -8)) ==> -7
Объяснение кода листинга программы
В коде определена функция TASK, которая принимает список в качестве аргумента. Внутри функции используется LET* для создания трех вспомогательных переменных:
- ML — инициализируется значением списка, в котором все элементы, не являющиеся отрицательными числами, удаляются.
- LL — инициализируется значением длины списка ML.
- SL — инициализируется значением суммы всех элементов списка ML.
Затем проверяется, является ли длина списка ML равной нулю. Если это так, то выводится сообщение
Отрицательных элементов нет!
. В противном случае, результатом является среднее арифметическое элементов списка ML, которое вычисляется путем деления суммы SL на длину списка LL. Пример использования функции: (task '(1 2 -6 7 -7 -8)) Результатом выполнения кода будет -7.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д