这个函数有问题。(defun two-similar-p (list1 list2) (mapcar (lambda (e) (mapcar (lambda (e1) (if (equal e e1) t)) list2)) list1))但是使用two-similar-p是不正确的,因为这个函数返回一个带有mapcar或T的新列表,但我只需要返回一个true或false。前任。(two-similar-p '(2 1 3) '(1 2 3))==> ((NIL T NIL) (T NIL NIL) (NIL NIL 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有什么建议吗? 最佳答案 最简单的“现成”解决方案是检查intersection是否至少包含两个元素:(defun two-similar-p (l1 l2) (consp (cdr (intersection l1 l2 :test #'equal))))OTS的解决方案是使用hash tables:(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)))))第二种方法的优点是它的复杂性是O(len(l1) + len(l2)),而mapcar方法将是O(len(l1) * len(l2))。该标准没有具体说明cc和的复杂性,但是大多数实现在这里很好地照顾他们的用户(低,复杂性将是线性的,而不是二次的)。
09-15 15:13