/ / remove z głęboką rekurencją w lisp - lisp, common-lisp

usuń z głęboką rekurencją w lisp - sepp, common-seplp

Jak mogę wdrożyć funkcję usuwania z głęboką rekurencją?

Wiem, jak pisać „usuń” w płytkiej rekurencji, ale ciężko jest zmienić to na głęboką rekurencję.

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

Odpowiedzi:

1 dla odpowiedzi № 1

Przypuszczam, że przez „głęboką rekurencję” masz na myśli rekurencję nad drzewem zamiast rekurencji na liście?

Bardziej niższym poziomem odpowiedzi na to pytanie jest powtórzeniew dół zarówno samochodu, jak i cdr komórek przeciw, zamiast tylko cdr. Chociaż wolałbym używać funkcji wyższego rzędu, w tym przypadku rekurencyjnie wywołuję mapcar:

(defun myremove (item tree)
(if (atom tree)
tree
(mapcar (lambda (subtree) (myremove item subtree))
(remove item tree :test #"equal))))

EDYCJA: Oto rozwiązanie niskiego poziomu:

(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))))))