es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Crear un árbol de objetos de forma recursiva (Python)

Me gustaría crear un árbol de objetos llamado Estado.

Cada Estado tiene una lista de 4 robots y cada estado tiene diferentes coordenadas de robots.
El objetivo es crear un gráfico que se resolverá mediante un algoritmo de búsqueda en anchura.
(El juego original es RicochetRobot, tal vez ustedes lo conozcan).

class Estado:
def __init__(self, padre, hijos, robots, cpt):
    self.padre = padre
    self.hijos = hijos
    self.robots = robots
    self.cpt = cpt

He creado una función llamada crear_hijo para hacer esto.

def crear_hijo(self, depth):
    # ARRIBA
    # La profundidad es la altura del árbol
    if depth == 0:
        print("PARAR")
        return
    else:
        for i in range(4):
            # Copiando los robots del objeto actual
            temp = copy.deepcopy(self.robots)

            # Obtener el índice del robot que se va a mover
            temp_robot = temp[i]

            # Eliminar este robot de la lista
            temp.pop(i)

            # Mover hacia arriba el robot e insertarlo en la lista
            # Mover hacia arriba es una función simple que incrementa la coordenada y del robot
            temp.insert(i, mover_arriba(temp_robot, crear_tablero(init_robot())))

            # Agregar un nuevo hijo a la lista de hijos
            self.hijos.append(Estado(self, self.hijos, temp, self.cpt + 1))

        # Decrementar la profundidad
        depth -= 1
        # Recursividad
        for hijo in self.hijos:
            hijo.crear_hijo(depth)

Mi problema es que cuando depth = 0, imprime “PARAR”, pero no retorna None y la función sigue ejecutándose. ¿Alguien sabe de dónde proviene esto?

Además, si pueden dar consejos sobre cómo hacer mi árbol de una manera más sencilla, sería bueno.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, no puedo ejecutar tu código, pero puedo suponer que la función no está devolviendo None porque está dentro de un bucle for anidado. La declaración de retorno está solo dentro de la declaración if, no dentro del bucle for, por lo que cuando el bucle for termina, la función continúa ejecutando la siguiente línea de código, que es la llamada recursiva. Si quieres que la función se detenga por completo cuando depth = 0, debes agregar una declaración de retorno fuera del bucle for. Podría ser así:

    if depth == 0:
        print("STOP")
        return None
    else:
        # aquí van tus bucles for y llamadas recursivas
    

    En cuanto a la creación del árbol, podrías usar una función recursiva que cree un nuevo objeto State para cada posible movimiento de cada robot en cada nivel del árbol. Sin embargo, mencionaste que ya tienes una función create_child, por lo que podrías modificarla para crear el árbol en lugar de solo crear una lista de nodos hijos para un objeto State dado. Deberías llamar a la función create_child en el nodo raíz de tu árbol con el nivel de profundidad deseado como argumento.

Comments are closed.