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