Lisp 列表之间的两个常见元素
我对这个函数有个问题 但是使用mapcar是不正确的,因为这个函数返回一个带有T或NIL的新列表,但我只需要返回true或false 前 我想用递归来比较各种元素,但我不知道怎么做。 我的功能需要像这样工作: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 有什么建议
(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)))))