Найти арифметическую сумму - Lisp
Формулировка задачи:
Решение задачи: «Найти арифметическую сумму»
(defun task (lst &optional (c 0) (sev 0) (sod 0)) (cond ((null lst) (if (zerop c) 'empty_list! (/ (- sev sod) c))) ;; четн минус нечетн ((evenp c) (task (cdr lst) (+ c 1) (+ sev (car lst)) sod)) (t (task (cdr lst) (+ c 1) sev (+ sod (car lst)))))) ==> task (task '(1 2 3 4 5 6 7 8 9 10)) ==> -1/2
Объяснение кода листинга программы
В коде определена функция task, которая принимает два аргумента: lst и c. Аргумент c является счетчиком, а lst — список чисел. Если список пустой, то возвращается значение empty_list!. Иначе, если c — четное число, то вызывается рекурсивный вызов функции task для списка cdr lst, увеличенного счетчика c и суммы sev и sod, которые инициализированы нулем. Если c — нечетное число, то также вызывается рекурсивный вызов функции task для списка cdr lst, увеличенного счетчика c и суммы sev и sod, которые инициализированы нулем. В конце функции возвращается результат вычисления (- sev sod) / c.
Значения переменных в коде:
— lst — список чисел (1 2 3 4 5 6 7 8 9 10)
— c — счетчик, инициализированный нулем
— sev — сумма нечетных элементов списка, инициализированная нулем
— sod — сумма четных элементов списка, инициализированная нулем