我是lisp的新手。我已经在lisp中写了一个flatten函数。
(defun flatten (list)
(cond ((null list) nil)
((atom (first list))
(cons (first list) (flatten (rest list))))
(t (append (flatten (first list)) (flatten (rest list))))))
INPUT-
(flatten '(a () b (c d)))
预期的输出 - (a b c d)
我的输出 - (a nil b c d)
我该怎么做才能避免' nil'从添加到列表?我应该做一个递归函数。
答案 0 :(得分:1)
(atom nil) ; ==> T
当然,因为()
是nil
,你需要制作一个新的基础案例,只有在它没有时才能进行递归而不是消失。
答案 1 :(得分:1)
你的问题是NIL既是空列表又是原子。所以(atom nil)
是正确的,但您希望将其视为空列表。要解决此问题,您需要单独处理(first list)
nil。
答案 2 :(得分:1)
问题是,NIL
虽然加倍the empty list
,仍然是atom
。
CL-USER> (atom nil)
T
CL-USER> (atom '())
T
CL-USER>
如果您需要忽略它,则需要更改第二个子句以专门检查NIL
。
...
((and (atom (first list)) (not (null (first list)))) ...)
...
另一个选择是更改基本案例,以便它在第一个返回值中正常处理NIL
。