我正在经历
this
为了好玩,他最后一句话就是:“练习:给出联合和差异的线性递归实现。”
团结,不流汗。
区别,汗水。
一次尝试看起来是这样的。…
(defun list-diff (L1 L2)
(cond
((null L1) L2)
((null (member (first L1) L2)) (cons (first L1) (list-diff (rest L1) L2)))
(t (list-diff (rest L1) L2))
)
)
现在,它返回所有在l1中的元素,这些元素不在l2中,但它只返回所有l2(显然)。同样,如果我将第3行的l2改为“nil”,那么它只返回所有不在l2中的l1,而不返回l2。
我在工作区的尝试看起来不是递归的,当它们是递归的时,我最终会得到堆栈溢出(比如我尝试在某处调用(列出diff l2 l1))。
他的任何其他练习,如列表交集,只需要遍历l1的元素。在这里,我想从l2中删除关键元素,或者运行(列出diff l2 l1),然后合并两个元素的结果,但这不再是线性递归。
思想?
(不是家庭作业,真的。我只是想试着看一些口齿不清的笑话。)
编辑:根据响应正确执行此操作的函数是:
(defun list-diff (L1 L2)
(cond
((null L1) nil)
((null (member (first L1) L2)) (cons (first L1) (list-diff (rest L1) L2)))
(t (list-diff (rest L1) L2))
)
)