Продвинутый remove-duplicates - Lisp

Узнай цену своей работы

Формулировка задачи:

Должно удалять дубликаты на всех уровнях списка. Пробовал сделать, но пока не поддается решению.
(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))
множество lst здесь, конечно, не поможет, ибо параллельная рекурсия, но других версий пока нет.

Решение задачи: «Продвинутый 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)))))))))

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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