Множество атомов, входящих только в первый из двух списков - Lisp
Формулировка задачи:
Здравствуйте, помогите пожалуйста решить задачу и нужно привести набор тестовых вызовов описанной функции.:
1. Опишите функцию, аргументами которой являются два списка, а результатом — множество, содержащее атомы, принадлежащие только первому списку, учитывая все атомы всех подсписков обоих списков.
Решение задачи: «Множество атомов, входящих только в первый из двух списков»
textual
Листинг программы
(defun deep-set-difference (w v) (set-difference (flatten w) (flatten v))) (defun flatten (w) (loop for a in w if (listp a) nconc (flatten a) else collect a)) > (deep-set-difference '(a e (((b)) c)) '(a (b (((c)))) d)) (E)
Объяснение кода листинга программы
В коде представлена функция глубокого пересечения множеств.
- Функция
deep-set-differenceпринимает два аргумента:wиv. - Функция
flattenиспользуется для преобразования аргументовwиvв одномерные списки. - В функции
flattenиспользуется циклloopдля обхода каждого элемента спискаw. - Если элемент является списком, то рекурсивно вызывается функция
flattenдля его преобразования в одномерный список. - Если элемент не является списком, то он добавляется в результирующий список.
- Результатом функции
deep-set-differenceявляется разница между двумя спискамиwиv. - Результатом функции
flattenявляется одномерный список. - Результатом вызова функции
deep-set-differenceс аргументами'(a e (((b)) c))и'(a (b (((c)))) d)является список'e'. - Это происходит потому, что функция
deep-set-differenceнаходит все элементы, которые есть в первом списке, но отсутствуют во втором списке. - В данном случае, элемент
'e'присутствует только в первом списке.