【发布时间】:2016-04-06 21:21:21
【问题描述】:
我有一个包含多个子列表的列表。其中一些具有我需要摆脱的 NIL 元素。我只能使用基本功能(NOT、EQL、CONS 等)
(defun trgni (lista)
(cond
((null lista) nil)
((not (atom (car lista))) (cons (trgni (car lista)) (trgni (cdr lista))))
((eql nil (car lista)) (trgni (cdr lista)))
(t (cons (car lista) (trgni (cdr lista))))))
我的代码有一个问题,当我有一个只包含 nil 的子列表时就会发生这种情况。例如:
(trgni '((NIL ((7))) (8 (9 (10 ((11))) 12)) (13 (NIL NIL))))
我的代码给了我:
((((7))) (8 (9 (10 ((11))) 12)) (13 NIL))
【问题讨论】:
-
"a sublist that contains only nils" 请记住,NIL 是空列表,因此
((NIL ((7))))与((() ((7))))相同。 -
@JoshuaTaylor 是的,但问题是它必须打印为 () 而不是 NIL,否则它将无效(作业中的规则)。
-
@Bonne 在 Common Lisp 中,
NIL和空括号()是完全相同的两个替代打印拼写:它们指的是"COMMON-LISP"包中名为"NIL"的符号. (您自己的包中可能有您自己的NIL,这不是COMMON-LISP::NIL符号;这是一个不同的问题)。(NIL NIL)和(() ())在含义上没有区别。 -
由于您的目标是学习(而不是真正从树中获取 nils),我想问您是否知道您的代码所采用的路径以便您留下 nil?我愿意。 :) 提示:尝试 (rgni '(13 (nil nil)))。如果您无法通过手动执行代码来解决问题,请使用跟踪或打印语句查看您要去哪里。 hth。 ps:这是非常重要的东西,需要掌握。
-
@kennytilton 好吧,我看到列表即将结束,因为如果列表为空,我告诉它发回
NIL,这就是它让我留下(13 NIL)的原因。但我不知道如何解决这个问题,因为代码中NIL的返回对于结束递归本身非常重要。