Soy bastante nuevo en Python y en las funciones recursivas como un todo, así que disculpe mi ignorancia.Declaraciones de retorno y recursión de Python
Estoy tratando de implementar un árbol binario de búsqueda en Python y tienen el siguiente método de inserción (sacado de una clase):
def insert(self, key, root=None):
'''Inserts a node in the tree'''
if root == None:
root = self.root
if root.key == None:
self._update(root, key)
return 0
else:
tmp = root
if key > tmp.key: # we work with the right subtree
self.insert(key, root=tmp.right)
elif key < tmp.key: # we work with the left subtree
self.insert(key, root=tmp.left)
else: # key already exists
return 0
No estoy seguro de si esto es legible, pero atraviesa el árbol hasta que llegue a un valor Ninguno y actualice el nodo con la clave para insertar.
Ahora, el método funciona bien y crea correctamente una BST desde cero. Pero hay un problema con las declaraciones de devolución, ya que solo devuelve 0 si no se realiza recursividad.
>>> bst.insert(10)
0
>>> bst.insert(15)
>>> bst.root.right.key
15
>>>
"Insertar" nuevamente la clave raíz devuelve 0 (de la línea 15) de la manera que debería.
>>> bst.insert(10)
0
No puedo entender por qué sucede esto. Si pongo una declaración de impresión en la línea 6, se ejecuta correctamente, sin embargo, no devolverá nada después de la primera inserción. ¿Por qué es esto? (Estoy bastante seguro de que me falta algo de información básica con respecto a Python y recursividad)
Gracias por su ayuda,
Ivan
PS: He leído que la repetición no es la mejor manera de Implementar un BST, entonces buscaré otras soluciones, pero me gustaría saber la respuesta a esto antes de continuar.
No estoy seguro de lo que piensas que debería regresar, aparte de 0. ¿Puedes mostrar lo que estás esperando? –
@miric: Creo que ha obtenido algunos consejos útiles de otros, pero también me gustaría señalar que su instinto de omitir la declaración de devolución podría sugerirle que piense en expresiones en lugar de declaraciones. Si es así, tal vez un lenguaje como Scheme te convenga. Ciertamente no tienes que rendirte en Python, pero mantén tu mente abierta a los lenguajes de programación funcionales. –