如何使用深度递归实现remove函数?
我知道如何在浅递归中编写remove,但很难将其更改为深度递归。
(myremove '(1 2) '(1 ((1 2) 3) (4 (5 ((1 2) 5))))) -> (1 (3) (4 (5 (5))))
答案 0 :(得分:1)
我想通过“深度递归”你指的是树上的递归而不是列表上的递归?
对此更低级别的答案是将汽车和缺陷单元的cdr向下,而不仅仅是cdr。虽然我更喜欢使用更高阶函数,但在这种情况下递归调用mapcar:
(defun myremove (item tree)
(if (atom tree)
tree
(mapcar (lambda (subtree) (myremove item subtree))
(remove item tree :test #'equal))))
编辑:这是一个低级别的解决方案:
(defun myremove (item tree)
(cond ((atom tree)
tree)
((equal item (car tree))
(myremove item (cdr tree)))
('otherwise
(cons (myremove item (car tree))
(myremove item (cdr tree))))))