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 № 1Przypuszczam, ż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))))))