Поменять местами первый элемент первого списка с последним элементом второго списка - Lisp
Формулировка задачи:
(DEFUN MEN (LST1 LST2) (COND ((CDR LST2)(MEN LST1 (CDR LST2))) ((QUOTE NULL)(CONS (CAR LST2)(CDR LST1)) ) ))
Решение задачи: «Поменять местами первый элемент первого списка с последним элементом второго списка»
(defun task (lst1 lst2 &optional (a (car lst1)) (b (cdr lst1)) (c nil)) (cond ((null (cdr lst2)) (list (cons (car lst2) b) (append (reverse c) (list a)))) (t (task nil (cdr lst2) a b (cons (car lst2) c))))) ==> TASK (task '(1 2 3 4 5) '(a b c)) ==> ((C 2 3 4 5) (A B 1)) (task '(1 2 3 4 5) '(a b c d e f g)) ==> ((G 2 3 4 5) (A B C D E F 1))
Объяснение кода листинга программы
В коде определена функция с именем task. Она принимает два аргумента: lst1 и lst2. Аргумент lst1 является первым списком, а lst2 — вторым. Также у функции есть три опциональных аргумента: a, b и c. Если a не указан, то он будет равен первому элементу lst1, если b не указан, то он будет равен остальной части lst1 после первого элемента, а если c не указан, то он будет равен nil.
Функция task рекурсивно вызывается для каждого из двух списков, пока не будет достигнуто условие выхода из рекурсии. Если второй список пуст, то функция возвращает новый список, в котором первый элемент второго списка и последний элемент первого списка поменяны местами, а остальная часть первого списка и второго списка объединяются в обратном порядке. Если второй список не пуст, то функция рекурсивно вызывается для второго списка с обновленными значениями a, b и c.
Примеры использования функции task:
(task '(1 2 3 4 5) '(a b c))вернет новый список((C 2 3 4 5) (A B 1)), где первый элемент первого списка и последний элемент второго списка поменяны местами.(task '(1 2 3 4 5) '(a b c d e f g))вернет новый список((G 2 3 4 5) (A B C D E F 1)), где первый элемент первого списка и последний элемент второго списка поменяны местами.