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