Вычислить знакочередующуюся сумму элементов списка - 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')