【发布时间】:2017-01-02 15:04:55
【问题描述】:
我正在尝试从列表的任何级别删除列表中所有出现的元素。 我需要使用地图功能。我正在使用 Common Lisp。例如,我希望能够做到:
(fdelete '(1 2 3 4 (3)) 3) => (1 2 4)
到目前为止我已经尝试过: 这个函数会做一些需要的事情。它将用 NIL 替换给定元素的所有出现,所以这不是我想要的。
(defun fdelete (l e)
(cond
((null l) 0)
((equal l e) nil)
((atom l) l)
(t (mapcar (lambda(l) (fdelete l e )) l ))
)
)
这样就可以了
(fdelete '(1 2 3 4 (3)) 3) => (1 2 NIL 4 (NIL))
我的第二次尝试是使用 mapcap 函数,因为它不会返回与输入列表大小相同的列表。 这将完成所需的操作,但它会“破坏”我的初始列表,例如,它将所有子列表“浮出水面”。
(defun fdelete (l e)
(cond
((null l) 0)
((equal l e) nil)
((atom l) (list l))
(t(mapcan(lambda(x) (fdelete x e ))l ))
)
)
所以这确实是(fdelete '(1 2 3 4 (3)) 3) => (1 2 4)
但如果我试试这个,它也会做错:
(fdelete '(1 2 3 (4) (3)) 3)) => (1 2 4)
我希望它这样做(fdelete '(1 2 3 (4) (3)) 3)) => (1 2 (4))
我希望我的问题结构良好且足够详细,并且我正在提供工作示例。有人能给我一些关于如何解决这个问题的提示吗?
【问题讨论】:
-
reduce被认为是“地图功能”吗? -
不,问题表明我必须使用 mapcon、mapcan、mapcar 或 maplist。顺便说一句,这不是家庭作业,我只是在为即将到来的考试练习。
-
真的应该是
(fdelete '(1 2 3 4 (3)) 3) => (1 2 4 ()),因为(fdelete '(3) 3) => ()。
标签: recursion common-lisp