从列表[Common Lisp]返回唯一项的递归函数

时间:2017-10-10 10:40:09

标签: lisp common-lisp clisp

我是新的Lisp程序员,需要一些帮助。

鉴于列表,我试图复制在另一个列表中出现一次的元素。

我做了以下事情:

(defun Unique-elements ( l uniqueList )
  (or (null l)
      (and (not (member (car l) (cdr l)))
           (Unique-elements (cdr l)))))

如果提供的列表包含不同的项,则该函数返回True。如何复制uniqueList中的不同项目并进行展示。

示例:

鉴于列表:

(1 2 3 4 4 5 6 6 7 8 8 8 8)

预期结果:

(1 2 3 5 7)

1 个答案:

答案 0 :(得分:4)

这将是原始问题的一个有效功能:

(defun has-only-unique-elements-p (l)
  (or (null l)
      (and (not (member (car l) (cdr l)))
           (has-only-unique-elements-p (cdr l)))))

如果要返回唯一元素,则需要以不同方式编写它。一个天真的算法:

  • 如果l为空,则返回NIL
  • 如果第一个元素在休息列表中,则删除该元素并递归调用该函数
  • 否则将第一个元素用于使用其余列表的递归调用的结果