Определить, равна ли сумма двух первых элементов заданного списка сумме двух его последних элементов - Lisp
Формулировка задачи:
сабж
: надо на lisp/scheme, и, желательно, как оформить это отдельно в виде макроса. Я даже не представляю что и как там обстоит, но надо без использования встроенных функций.Решение задачи: «Определить, равна ли сумма двух первых элементов заданного списка сумме двух его последних элементов»
(defun task (lst &optional (n (length lst)) (c nil)) (cond ((<= n 1) nil) ((= n 2) t) ((null (cddr lst)) (= c (+ (car lst) (cadr lst)))) ((null c) (task lst n (+ (car lst) (cadr lst)))) (t (task (cdr lst) n c))))
Объяснение кода листинга программы
В коде определена функция с именем task. Она принимает два аргумента: lst и n. Аргумент n является необязательным и по умолчанию равен длине списка lst.
Функция проверяет условия и возвращает nil, если они не выполняются. Если длина списка n меньше или равна 1, функция возвращает nil. Если n равно 2, функция возвращает t.
Если список не пустой, функция проверяет его последний элемент. Если он равен nil, значит, список имеет нечетное количество элементов, и функция возвращает nil. Если список пустой, функция вызывает саму себя, передавая в качестве аргументов lst, n и nil.
Если список имеет четное количество элементов, функция проверяет сумму двух первых элементов и двух последних элементов. Если они равны, функция возвращает t, иначе nil.