Lisp 列表之间的两个常见元素

Lisp 列表之间的两个常见元素,lisp,common-lisp,Lisp,Common Lisp,我对这个函数有个问题 但是使用mapcar是不正确的,因为这个函数返回一个带有T或NIL的新列表,但我只需要返回true或false 前 我想用递归来比较各种元素,但我不知道怎么做。 我的功能需要像这样工作: (two-similar-p '(1 2 3) '(1 4 5)) ; ==> nil (two-similar-p '(1 2 5) '(1 4 5)) ; ==> t (two-similar-p '(1 2 6) '(6 4 2)) ; ==> t 有什么建议

我对这个函数有个问题

但是使用mapcar是不正确的,因为这个函数返回一个带有T或NIL的新列表,但我只需要返回true或false

我想用递归来比较各种元素,但我不知道怎么做。 我的功能需要像这样工作:

(two-similar-p '(1 2 3) '(1 4 5)) ; ==> nil

(two-similar-p '(1 2 5) '(1 4 5)) ; ==> t

(two-similar-p '(1 2 6) '(6 4 2)) ; ==> t

有什么建议吗?

最简单的现成解决方案是检查是否包含至少两个元素:

(defun two-similar-p (l1 l2)
  (consp (cdr (intersection l1 l2 :test #'equal))))
稍微少一点的OTS解决方案是使用:

第二种方法的优点是其复杂性为Olenl1+lenl2, 而mapcar方法将是Olenl1*lenl2


该标准没有规定交叉点的复杂性,但大多数实现都很好地照顾了用户。因此,复杂性将是线性的,而不是二次的。

为什么第一个示例返回nil?ops,对不起,第一个示例返回nil,因为它们没有至少两个相等的元素。是否需要使用mapcar?否,我错误地认为使用double mapcar函数来比较列表1的第一个元素和列表2的元素。列表1的第二个元素与列表2的元素ecc的情况相同……非常感谢!我正在使用第一个解决方案和所有工作
(two-similar-p '(1 2 3) '(1 4 5)) ; ==> nil

(two-similar-p '(1 2 5) '(1 4 5)) ; ==> t

(two-similar-p '(1 2 6) '(6 4 2)) ; ==> t
(defun two-similar-p (l1 l2)
  (consp (cdr (intersection l1 l2 :test #'equal))))
(defun two-similar-p (l1 l2)
  (let ((h1 (make-hash-table :test 'equal))
        (common 0))
    (dolist (x l1)
      (setf (gethash x h1) t))
    (dolist (x l2)
      (when (gethash x h1)
        (incf common))
      (when (>= common 2)
        (return t)))))