在lisp中使用深度递归删除

时间:2011-03-28 17:27:31

标签: lisp common-lisp

如何使用深度递归实现remove函数?

我知道如何在浅递归中编写remove,但很难将其更改为深度递归。

 (myremove '(1 2) '(1 ((1 2) 3) (4 (5 ((1 2) 5))))) -> (1 (3) (4 (5 (5))))

1 个答案:

答案 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))))))