You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Common Lisp实现列表交集函数返回NIL及递归t分支疑问

Common Lisp intersect函数恒返回NIL问题修复

错误根因

你的代码存在cond表达式括号嵌套错误,分支逻辑完全写串了:

;; 错误代码
(defun intersect (L1 L2)
(cond 
((null L1) nil)
((member (first L1) L2)
(t (intersect (rest L1) L2)))))

梳理S表达式结构就能发现,cond实际只识别到两个顶层分支:

  • 分支1:L1为空时返回nil
  • 分支2:判断(member (first L1) L2)是否为真,为真时执行(t (intersect (rest L1) L2))

你以为是兜底分支的t根本不在cond的分支列表里,它被错当成第二个分支的执行代码了。当L1非空、且首元素不在L2里时,第二个分支条件不成立,cond匹配不到任何有效分支,直接返回NIL,这就是函数永远返回NIL的核心原因。如果首元素刚好在L2里,这段代码还会直接报错——因为它会尝试调用名为t的函数,而Common Lisp里t是真值常量,不是可调用的函数。

分支逻辑说明

列表求交集的标准递归逻辑非常清晰:

  • 递归终止:L1为空时,交集必然是空表,返回nil
  • 元素命中:如果L1的第一个元素在L2里存在,就把这个元素用cons拼到「L1剩余部分和L2的交集」结果前面,作为当前层的返回值
  • 兜底分支(t分支):如果L1第一个元素不在L2里,直接丢掉这个元素,递归求L1剩余部分和L2的交集,把递归结果直接返回即可

修正后可运行代码

(defun intersect (L1 L2)
  (cond 
    ((null L1) nil)
    ((member (first L1) L2)
     (cons (first L1) (intersect (rest L1) L2)))
    (t (intersect (rest L1) L2))))

修正后的t分支没有额外逻辑:当前元素不属于交集,直接把下一层递归的返回值透传上来就行。

内容的提问来源于stack exchange,提问作者progg123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 17:06:29