Lisp 如何避免NIL被添加到列表中?
我是口齿不清的新手。我已经用lisp编写了一个展平函数Lisp 如何避免NIL被添加到列表中?,lisp,Lisp,我是口齿不清的新手。我已经用lisp编写了一个展平函数 (defun flatten (list) (cond ((null list) nil) ((atom (first list)) (cons (first list) (flatten (rest list)))) (t (append (flatten (first list)) (flatten (rest list)))))) 输入- (展平(a()b(cd))) 预期输出-
(defun flatten (list)
(cond ((null list) nil)
((atom (first list))
(cons (first list) (flatten (rest list))))
(t (append (flatten (first list)) (flatten (rest list))))))
输入-
(展平(a()b(cd)))
预期输出-(a b c d)
我的输出-(a无b c d)
我应该怎么做才能避免“nil”被添加到列表中?我应该创建一个递归函数。
(atom nil);=>当然,既然()
是nil
,你需要建立一个新的基本情况,它只是递归,而不是考虑它是nil 您的问题是NIL既是一个空列表,也是一个原子。所以(atom nil)
是真的,但您希望将其视为空列表。要解决这个问题,您需要分别处理(第一个列表)
为零。问题是为零
,同时作为空列表
,仍然是一个原子
CL-USER> (atom nil)
T
CL-USER> (atom '())
T
CL-USER>
如果您需要忽略它,那么您需要更改第二个子句来检查NIL
...
((and (atom (first list)) (not (null (first list)))) ...)
...
另一个选项是更改基本大小写,以便它在第一个返回值中优雅地处理NIL
s。明白了!谢谢你的帮助。:)