Создать функцию, которая из списка атомов создает список с уникальными атомами - Lisp
Формулировка задачи:
помогите с задачей на лиспе:
Надо создать функцию ATOMI-UNICAT который из списка атомов будит создать новый список из атомов которые не повторяются. Пример:
(ATOMI-UNICAT ’(A B A C B)) -> (C)
Решение задачи: «Создать функцию, которая из списка атомов создает список с уникальными атомами»
textual
Листинг программы
(defun flatten (w) (loop for a in w if (listp a) nconc (flatten a) else collect a)) (defun unique (w &optional (v w)) (cond ((null w) nil) ((> (count (car w) v) 1) (unique (cdr w) v)) ((cons (car w) (unique (cdr w) v))))) (defun unique-atoms (w) (unique (flatten w))) > (unique-atoms '(1 2 (((2 3 4))) 7 (8 (9 1)))) (3 4 7 8 9)
Объяснение кода листинга программы
- Создается функция
flatten, которая рекурсивно обходит списокw. - Если элемент
aявляется списком, то функцияnconcобъединяет его с результатом рекурсивного вызова функцииflattenдля этого элемента. - Если элемент
aне является списком, то он добавляется в результат. - Результатом работы функции
flattenбудет список, в котором все элементы списка приведены к одному уровню. - Создается функция
unique, которая принимает списокwи необязательный аргументv. - Если список
wпустой, то возвращаетсяnil. - Если элемент
aвстречается в спискеvболее одного раза, то функцияuniqueвызывается рекурсивно для спискаcdrи аргументомv. - Если элемент
aвстречается в спискеvтолько один раз, то он добавляется в результат. - Результатом работы функции
uniqueбудет список, в котором все элементы списка встречаются только один раз. - Создается функция
unique-atoms, которая принимает списокwи вызывает функциюuniqueдля списка, полученного с помощью функцииflatten. - Результатом работы функции
unique-atomsбудет список, в котором все элементы являются уникальными атомами списка. - Вызывается функция
unique-atomsс аргументом'(1 2 (((2 3 4))) 7 (8 (9 1)) - Результатом выполнения функции будет список
(3 4 7 8 9), который выводится на экран.