【问题标题】:Lisp function for duplicate elements重复元素的 Lisp 函数
【发布时间】:2018-03-24 00:52:02
【问题描述】:

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

【问题讨论】:

  • 太好了!学习 Lisp 很有趣。您有实际问题吗?
  • 我已经更新了问题...
  • 为什么不改函数UNIQUE呢?反转真值的函数称为 NOT。
  • 大多数 Lisps 不区分大小写,因此您选择的名称 Unique 看起来很奇怪。在现代风格中,大多数代码都是用小写的,即使它在打印出来时显示不是大写的。
  • 我怎样才能使这个函数与列表一起工作?当我把这个(DUPLICATE-ELEMENTS ‘(a b (a b)) 我得到NIL 结果,但是当我把这个(DUPLICATE-ELEMENTS ‘(a b (a b) c d (a b))) 我也得到NIL,但正确的结果应该是T

标签: lisp common-lisp


【解决方案1】:

也许你需要这样的东西:

(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)))

?您还可以声明用于比较的谓词作为函数的参数。为什么在等待T 时,您的DUPLICATE-ELEMENTS 会返回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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    相关资源
    最近更新 更多