Создать функцию, которая из списка атомов создает список с уникальными атомами - 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)

Объяснение кода листинга программы

  1. Создается функция flatten, которая рекурсивно обходит список w.
  2. Если элемент a является списком, то функция nconc объединяет его с результатом рекурсивного вызова функции flatten для этого элемента.
  3. Если элемент a не является списком, то он добавляется в результат.
  4. Результатом работы функции flatten будет список, в котором все элементы списка приведены к одному уровню.
  5. Создается функция unique, которая принимает список w и необязательный аргумент v.
  6. Если список w пустой, то возвращается nil.
  7. Если элемент a встречается в списке v более одного раза, то функция unique вызывается рекурсивно для списка cdr и аргументом v.
  8. Если элемент a встречается в списке v только один раз, то он добавляется в результат.
  9. Результатом работы функции unique будет список, в котором все элементы списка встречаются только один раз.
  10. Создается функция unique-atoms, которая принимает список w и вызывает функцию unique для списка, полученного с помощью функции flatten.
  11. Результатом работы функции unique-atoms будет список, в котором все элементы являются уникальными атомами списка.
  12. Вызывается функция unique-atoms с аргументом '(1 2 (((2 3 4))) 7 (8 (9 1))
  13. Результатом выполнения функции будет список (3 4 7 8 9), который выводится на экран.

Оцени полезность:

10   голосов , оценка 4.3 из 5
Похожие ответы