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