Вычислить знакочередующуюся сумму элементов списка - Lisp
Формулировка задачи:
Решение задачи: «Вычислить знакочередующуюся сумму элементов списка»
(defun asum (lst) (apply '+ (mapcar (lambda (n x) (if (zerop (mod n 2)) (- x) x)) (range 1 (length lst)) lst))) ==> asum (asum '(1 2 3 4 5 6 7)) ==> 4
Объяснение кода листинга программы
В данном коде определён процедурный языковой конструктор с именем asum
. Он принимает в качестве аргумента список lst
. Внутри конструктора используется функция apply
, которая применяет функцию плюс к результату работы функции mapcar
.
Функция mapcar
применяет к каждому элементу списка lst
анонимную функцию, которая принимает два аргумента n
и x
. Внутри анонимной функции проверяется, является ли n
чётным числом. Если это так, то возвращается x
умноженное на -1, иначе возвращается просто x
. Результатом работы функции mapcar
будет новый список, в котором каждый элемент исходного списка lst
будет заменён на результат работы анонимной функции. Затем результат работы функции apply
сохраняется в переменную sum
. В конце процедуры возвращается значение переменной sum
.
(defun asum (lst)
— определение языкового конструктораasum
(apply '+ (mapcar (lambda (n x) (if (zerop (mod n 2)) (- x) x)) (range 1 (length lst)) lst)
— вычисление значения конструктораasum
для спискаlst
(asum '(1 2 3 4 5 6 7))
— вызов конструктораasum
с аргументом'(1 2 3 4 5 6 7')
4
— результат вычисления конструктораasum
для списка'(1 2 3 4 5 6 7')
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д