我是 LISP 初学者,所以我需要编写一个函数 (DUPLICATE-ELEMENTS L)
,它检查 L 中元素(原子或列表)的重复出现。
例子:
(DUPLICATE-ELEMENTS '(a b a c)) -> T
(DUPLICATE-ELEMENTS '(a b (a b)) -> NIL
(DUPLICATE-ELEMENTS '(a b (a b) c d (a b))) -> T
我发现了这个检查唯一性的函数
(defun Unique (l)
(or (null l)
(and (not (member (car l) (cdr l)))
(Unique (cdr l)))))
但我需要反之亦然,例如示例。请你帮助我好吗。
当我运行这个
(Unique '(a b a c))
我收到 NIL
,但我需要收到 T
最佳答案
也许你需要这样的东西:
(defun unique (data-list)
(or (null data-list)
(and (not (member (car data-list) (cdr data-list) :test #'equalp))
(unique (cdr data-list)))))
(defun duplicate-elements (data-list)
(not (unique data-list)))
?您也可以声明用于比较的谓词作为函数的参数。为什么您认为您的 DUPLICATE-ELEMENTS
在您等待 T
时返回 nil
?我认为这是因为 member
用于比较某些默认谓词的值。也许它是一个 eq
,它没有用于列表比较。看这个例子:
(defun unique (data-list &key (test #'eq))
(or (null data-list)
(and (not (member (car data-list) (cdr data-list) :test test))
(unique (cdr data-list)))))
(defun duplicate-elements (data-list &key (test #'eq))
(not (unique data-list :test test)))
以及如何使用它们来获得正确的结果:
CL-USER> (duplicate-elements '((a b) a c (a b)))
NIL
CL-USER> (duplicate-elements '((a b) a c (a b)) :test #'equalp)
T
关于重复元素的 Lisp 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46703591/