Объединить 2 списка в один, элементы которого будут только те элементы, которые есть в первом, но нет во втором - Lisp
Формулировка задачи:
Решение задачи: «Объединить 2 списка в один, элементы которого будут только те элементы, которые есть в первом, но нет во втором»
(defun task (lst1 lst2) (remove-if (lambda (x) (member x lst2)) lst1)) ==> TASK (task '(1 2 4 7 8) '(3 5 8 2 0 5)) ==> (1 4 7) (defun task (lst1 lst2) (cond ((null lst1) nil) ((member (car lst1) lst2) (task (cdr lst1) lst2)) (t (cons (car lst1) (task (cdr lst1) lst2))))) ==> TASK (task '(1 2 4 7 8) '(3 5 8 2 0 5)) ==> (1 4 7)
Объяснение кода листинга программы
В первом представленном фрагменте кода функция task
принимает два аргумента: lst1
и lst2
. Она возвращает новый список, который содержит только те элементы из lst1
, которых нет в lst2
. Для этого используется функция remove-if
, которая удаляет элементы, удовлетворяющие заданному условию (в данном случае, элементы, которые присутствуют во втором списке).
Во втором фрагменте кода функция task
реализована с использованием cond
. В первом условии проверяется, является ли lst1
пустым. Если это так, то возвращается nil
. Во втором условии проверяется, есть ли первый элемент lst1
во втором списке. Если это так, то рекурсивно вызывается функция task
с cdr lst1
и lst2
. В третьем условии, если оба предыдущих условия не выполняются, то к результату рекурсивного вызова функции task
добавляется первый элемент lst1
.
Таким образом, оба фрагмента кода выполняют одну и ту же задачу - объединяют два списка в один, оставляя только те элементы из первого списка, которых нет во втором.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д