Продвинутый remove-duplicates - Lisp
Формулировка задачи:
Должно удалять дубликаты на всех уровнях списка. Пробовал сделать, но пока не поддается решению.
Попытки
множество lst здесь, конечно, не поможет, ибо параллельная рекурсия, но других версий пока нет.
(1 2 (6 5) 2 3 (5 4)) ==> (1 (6) 2 3 (5 4))
(defun F (l &optional (lst (setof (flatten l)))) (cond ((null l) nil) ((atom (car l)) (if (member (car l) lst) (cons (car l) (F (cdr l) (remove (car l) lst))) (F (cdr l) lst))) (t (cons (F (car l) lst) (F (cdr l) lst))))) (f '(1 2 (6 5) 2 3 (5 4))) ==> (1 2 (6 5) 3 (5 4))
Решение задачи: «Продвинутый remove-duplicates»
textual
Листинг программы
(defun del-dup (lst &optional (s nil)) (cond ((null lst) nil) (t (let ((a (car lst))) (cond ((atom a) (if (member a s) (del-dup (cdr lst) s) (cons a (del-dup (cdr lst) (cons a s))))) (t (cons (del-dup a s) (del-dup (cdr lst) (append (setof (flatten a)) s)))))))))
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д