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