重复元素的 Lisp 函数

标签 lisp common-lisp

我是 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/

相关文章:

lisp - 为什么我在 Elisp 中索引列表时遇到问题?

lisp - Lisp 中的位置函数错误

common-lisp - 为什么 REPL 没有显示函数调用的完整跟踪?

macros - 在 Scheme 中添加宏

lisp - Elisp中定义的pow-mod函数在哪里

macros - 带有 defclass 的 defmacro

common-lisp - 为什么有些人在循环宏的子句中使用关键字?

linux - Lisp 工具包 (ltk) : Cannot get SCALE :variable value

inheritance - 相当于 CLOS 的 instanceof?如何检查实例是否从另一个对象继承?

functional-programming - 替换符号表达式中的符号