gpt4 book ai didi

list - 使用 Common Lisp 删除多级列表中的重复项

转载 作者:太空宇宙 更新时间:2023-11-03 19:00:47 25 4
gpt4 key购买 nike

删除多级列表中的重复项(使用 Common Lisp)而不更改列表的内部结构。这个问题对我来说似乎是一个难题和一个大问题。

来源列表:(1 2 (6 5) 2 3 (5 4)) ==> 结果:(1 (6) 2 3 (5 4))

这是我的无效决定:

LispWokrs:

(defun F (l &optional (lst (remove-duplicates (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)))))

我尝试使用 lst 来保持一个清晰的集合 (1 2 6 5 3 4),并且每次我添加一个新元素时我都试图从这个集合中删除一个元素。但是我得到的是几乎相同的源序列(并行递归...):

(f '(1 2 (6 5) 2 3 (5 4))) ==> (1 2 (6 5) 3 (5 4))

(f '(- ((B C E) D (B E A)))) ==> (- ((B C E) D (B E A)))

然后在网上搜索了一下,也没有解决这个问题。

最佳答案

试试这个:

(defun multi-level-list-remove-duplicates (tree)
(let ((seen NIL))
(labels ((rec (l)
(cond
((null l) NIL)
((consp (car l)) (cons (rec (car l))
(rec (cdr l))))
((member (car l) seen) (rec (cdr l)))
(T (push (car l) seen)
(cons (car l) (rec (cdr l)))))))
(rec tree))))

这会在 seen 中维护一个已经看到的值列表,如果再次看到则删除这些值。递归函数 rec 关闭该值,因此所有子列表在每次调用 multi-level-list-remove-duplicates< 时共享一个 seen 变量.

关于list - 使用 Common Lisp 删除多级列表中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22699801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com