Если вы можете убедиться, что списки отсортированы (по возрастанию), вы можете сделать что-то вроде
(defun isect (l1 l2 acc)
(let ((f1 (car l1))
(f2 (car l2))
(r1 (cdr l1))
(r2 (cdr l2)))
(cond ((or (null l1) (null l2)) acc)
((= f1 f2) (isect r1 r2 (cons f1 acc)))
((< f1 f2) (isect r1 l2 acc))
((> f1 f2) (isect l1 r2 acc)))))
Обратите внимание, что результат находится в обратном порядке.Также в примере предполагается, что элементы являются числами.Если вы хотите обобщить, вы можете передать порядок в качестве необязательного аргумента, чтобы заставить его работать с произвольными элементами.
Примечание: решение, использующее loop
, вероятно, будет быстрее, но я не мог придумать, как частично«продвигать» списки, когда car
s отличаются.