Вычислить знакочередующуюся сумму элементов списка - Lisp

Узнай цену своей работы

Формулировка задачи:

Определите функцию (f s), вычисляющую знакочередующую сумму al-a2+a34+ ...+аk*(-1 )^k для списка s, имеющего вид (al а2 аЗ ... аk).

Решение задачи: «Вычислить знакочередующуюся сумму элементов списка»

textual
Листинг программы
(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.

  1. (defun asum (lst) — определение языкового конструктора asum
  2. (apply '+ (mapcar (lambda (n x) (if (zerop (mod n 2)) (- x) x)) (range 1 (length lst)) lst) — вычисление значения конструктора asum для списка lst
  3. (asum '(1 2 3 4 5 6 7)) — вызов конструктора asum с аргументом '(1 2 3 4 5 6 7')
  4. 4 — результат вычисления конструктора asum для списка '(1 2 3 4 5 6 7')

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5
Похожие ответы