我正在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之类的交集,需要递归地使用它,而我无法找到方法来实现它
答案 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)