Перестроить список в список средних арифметических элементов циклом - Lisp
Формулировка задачи:
Всем доброго времени суток, возникла необходимость решить мою прошлую задачу циклом Перестроить список в список средних арифм. элементов
Условие:Дан список чисел а1....an. Получить список чисел b1…bn, где bi – среднее арифметическое всех членов последовательности a1….an, кроме ai.
В строке (loop while (not ((null lst) nil)) do ошибка: (NULL LST) should be a lambda expression, как решить?
пробовал запрет на вычисление ставить и добавлять перед условием t, не помогло.
(defun task (lst (s (apply '+ lst))) (loop while (not ((null lst) nil)) do( (t (cons (/ (- s (car lst)) l) )))))
Решение задачи: «Перестроить список в список средних арифметических элементов циклом»
textual
Листинг программы
(defun task (lst &aux (s (apply '+ lst)) (l (- (length lst) 1))) (let ((r nil)) (dolist (i lst (reverse r)) (push (/ (- s i) l) r)))) ==> task (task '(1 2 3 4 5 6 7)) ==> (9/2 13/3 25/6 4 23/6 11/3 7/2)
Объяснение кода листинга программы
В этом коде функция task принимает список в качестве входного аргумента и возвращает список средних арифметических элементов.
Вот список шагов, которые выполняются в коде:
- Создается новая функция
task, которая принимает списокlstв качестве аргумента. - Внутри функции
taskсоздаются две переменные:sиl. Значение переменнойsравно сумме всех элементов спискаlst. Значение переменнойlравно длине спискаlst, уменьшенной на 1. - Создается пустой список
r, который будет содержать средние арифметические значения. - Начинается цикл
dolist, который перебирает элементы спискаlstв обратном порядке. - Внутри цикла
dolistвыполняется следующая последовательность действий:- Вычисляется значение среднего арифметического, путем деления суммы всех элементов списка
lstна значение переменнойl. - Это значение добавляется в конец списка
r.
- Вычисляется значение среднего арифметического, путем деления суммы всех элементов списка
- По завершении цикла
dolistвозвращается списокr. В результате выполнения функцииtaskсо списком[1 2 3 4 5 6 7]в качестве аргумента, будет возвращен список[9/2 13/3 25/6 4 23/6 11/3 7/2].