2015-12-17 36 views
0

我必须从所有级别删除列表中元素的所有出现。 我的代码是:无结果列表Lisp

(defun sterge(e l) 
    (cond 
    ((and (atom l) (equal e l)) nil) 
    ((atom l) (list l)) 
    (t (append (apply #'list (mapcar #' (lambda (l) (sterge e l)) l)))) 
) 
) 
(defun sterg(e l) 
    (car (sterge e l)) 
) 

当我给:

(sterg 1 '(1 2 1 (1 2 1(1 (1) (1)) (1) 3) (1)(2))) 

它让我看到输出:

((2 (2 (NIL NIL) NIL 3) NIL (2))) 

如何删除零?谢谢。

+1

如果您从(1)中删除1,您应该(正确)得到一个空列表,即NIL。这正是你从你的功能中获得的。换句话说,该功能是正确的!为了确信这一点,在REPL中写入'(remove 1'(1))'(使用标准函数'remove')。 – Renzo

回答

1

而不是返回nil,考虑返回sterge适用于实体的其余部分lmapcar不是解决此问题的最佳方法;递归函数是较好的(除非分配指定使用mapcar,当然。)

提示:治疗l就好像它是一个列表,并且测试(car l),例如(atom (car l)),适用于sterge(cdr l)

+0

它给我堆栈溢出(堆栈大小31744)。 –

+1

您可能需要确保'l'不是一个空列表来终止递归。 :-) –