Продвинутый 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)))))))))

ИИ для рефератов и докладов


  • Экспорт Word по ГОСТу
  • Минимум 80% уникальности текста
  • Поиск релевантных источников в интернете
  • Готовый документ за 2 минуты

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

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