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