LISP中如何去除自定义DFS函数返回结果中的NIL值
Lisp 右序DFS遍历多余NIL问题修复方案
问题根源
你现有代码的遍历逻辑本身符合右到左DFS的要求,返回嵌套点对和多余NIL的核心问题出在结果拼接环节:
Lisp中(cons A B)仅当B是列表时才会生成标准线性列表,当B是原子、A是NIL(空节点返回值)时,就会生成(NIL . 原子)的点对结构,多层递归嵌套后就形成了你遇到的带多余NIL的嵌套点对。
修复代码
仅需修改最后一个分支的拼接逻辑,无需调整原有遍历规则:
(defun DFS (tree) (cond ((null tree) ()) ; 空节点返回空列表,逻辑不变 ; 首元素为列表时的展开遍历逻辑不变 ((listp (car tree)) (DFS (append (car tree) (cdr tree)))) ; 核心修改:将当前原子包装为单元素列表,用append做列表拼接,避免生成点对和多余NIL (T (append (DFS (cdr tree)) (list (car tree))))))
效果验证
执行测试用例(DFS '((((L E) F) T))),返回结果为(T F E L),符合预期且无多余NIL。
内容的提问来源于stack exchange,提问作者user15569323
相关产品推荐
相关产品推荐

