/ / eliminar con recursión profunda en lisp - lisp, common-lisp

eliminar con recursión profunda en lisp - lisp, common-lisp

¿Cómo puedo implementar la función eliminar con una profunda recursión?

Sé cómo escribir eliminar en recursión superficial, pero es difícil cambiar esto en recursión profunda.

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

Respuestas

1 para la respuesta № 1

Supongo que por "recursión profunda", ¿te refieres a recursión sobre un árbol en lugar de recursión sobre una lista?

La respuesta de más bajo nivel a esto es responderBaje tanto el auto como el CDR de las celdas contras, en lugar de solo el CDR. Aunque prefiero usar funciones de orden superior, en este caso llamar a mapcar de forma recursiva:

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

EDITAR: Aquí hay una solución de bajo nivel:

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