recursive programming loop how else elif def create python list recursion

loop - recursive programming python



Agregar recursivamente a una lista vinculada ordenada (1)

Estoy intentando crear una función de agregar para agregar recursivamente a una lista vinculada ordenada y parece que no puedo comenzar. Me dieron las dos funciones

def add(self, item): new_node = Node(item) curr = self.__head prev = None self.add_recursive(new_node, curr, prev) def add_recursive(self, new_node, curr, prev): pass

Sé cómo agregar a una lista vinculada ordenada en un método tradicional, pero no puedo entender cómo hacerlo llamando de esta manera, así como con recursividad. Otras funciones que se pueden usar en esta clase son .is_empty() y .size()

Gracias


Cuando se trata de estructuras jerárquicas (como árboles), el cerebro humano puede visualizar fácilmente la recursión (pensamos recursivamente), pero con estructuras planas como listas enlazadas, esto ciertamente parece más difícil de lograr.

Vamos a romper esto. ¿En qué punto deberíamos agregar un nodo? Ciertamente, cuando sabemos que no hay nodos en frente de curr . En este punto, asignaría curr.next = new_node y lo devolverá. Hasta entonces, avanzas curr y continúas. Esto es lo que sucede también en el sentido iterativo.

Al poner esta comprensión en el código, tendrías

def add_recursive(self, new_node, curr, prev): """ note that we aren''t yet taking care of the case when head is None """ if not curr.next: curr.next = new_node return return self.add_recursive(new_node, cur.next, cur)

Una consideración importante es el caso de la esquina cuando se está insertando por primera vez. En ese caso, llamaría a .is_empty o size y verificará si la lista vinculada tiene elementos o no, y en consecuencia asignará self.head = new_node :

if self.is_empty(): self.head = new_node return

Este es el primer control que debe hacerse. Entonces, tu función completa ahora se convierte en:

def add_recursive(self, new_node, curr, prev): if self.is_empty(): self.head = new_node return elif not curr.next: curr.next = new_node return return self.add_recursive(new_node, cur.next, cur)