LISP比较董事会中的元素

时间:2014-12-13 00:44:12

标签: list recursion lisp common-lisp

我正在Common Lisp做一个大学项目

我需要比较4x4列表 例如:

(
((white full circle) (black empty circle) (black full circle) (white empty circle))
(0 0 0 0)
(0 0 0 0)
(0 0 0 0)
)

我需要比较一行是否有4个共享元素的列表,在这种情况下" circle" 并且我不能使用任何defvar之类的交集,需要递归地使用它,而我无法找到方法来实现它

1 个答案:

答案 0 :(得分:1)

试试这个:

(defun find-common (x)
  (labels ((compare (items lst)
            (cond ((null items) nil)
              ((not (remove-if #'(lambda (k) (member (car items) k)) lst))
               (cons (car items) (compare (cdr items) lst)))
              (t (compare (cdr items) lst)))))
    (cond ((null x) nil)
      (t (cons (compare (caar x) (car x)) 
               (find-common (cdr x)))))))

要查看列表列表是否共享一个公共元素,我们必须检查该列表的car中的每个元素是否也出现在其cdr的每个列表中。这就是compare函数的作用。它会以递归方式检查所有列表中是否出现元素。

find-common函数以递归方式搜索列表列表中的所有常见事件。

我们假设table是您的4 x 4列表:

(setf table
    '(((white full circle) (black empty circle) (black full circle) (white empty circle))
      ((3 2 8 5) (2 9 1 8) (23 8 2 1) (3 8 0 2))
      ((one five six) (six one five) (five one six) (one six five))
      ((green blue red) (green red blue) (silver red white) (green yellow blue))))

调用find-common函数:

>(find-common table)

((CIRCLE) (2 8) (ONE FIVE SIX) NIL)