Atascado/a con la implementación de permutaciones utilizando recursión. No obtengo ninguna salida.
Quiero escribir una función permutations(route, cities)
. Debe tomar una lista (cities
), agregar todas las permutaciones posibles de las cities
a la lista route
e imprimir cada permutación en una nueva línea de la route
. Cada permutación debe comenzar con la primera ciudad, es decir, “Boston”.
Estoy usando la recursividad para esta implementación, pero no logro que funcione.
def permutations(route, cities):
def recurs(cities_temp):
if len(cities_temp) == 0:
return []
elif len(cities_temp) == 1:
return [cities_temp]
else:
route_temp = []
for i in range(len(cities_temp)):
x = cities_temp[i] #x es el elemento i de la lista de entrada
y = cities_temp[:i] + cities_temp[1+i:] #y es lo que queda (todo excepto el elemento i)
for j in recurs(y):
route_temp.append([x] + j)
return route_temp
route = recurs(cities)
print(' '.join([city_names[i] for i in route]))
city_names = ["Boston", "Seattle", "Chicago", "Dallas"]
permutations([0], list(range(1, len(city_names)))) #llamando a la función permutations
¿Podrían echarle un vistazo y decirme qué estoy haciendo mal?
davy.ai
Parece que el problema principal con la implementación actual es que la lista
route
no se actualiza a medida que se generan las permutaciones. En su lugar, se crea una nueva listaroute_temp
dentro de la funciónrecurs
y se devuelve como resultado final. Esto significa que la listaroute
pasada como argumento a la funciónpermutations
no cambia.Para solucionar este problema, una posible solución sería modificar la función
recurs
para que tome la listaroute
como un argumento adicional y la actualice a medida que se generen las permutaciones. A continuación, se muestra una implementación actualizada:En esta implementación actualizada, la función
recurs
ahora recibe un argumento adicionalroute
, que es la permutación actual que se está generando. La función primero verifica los casos base de una lista de entrada vacía o con un solo elemento, agregando la última ciudad a la listaroute
y imprimiéndola si se alcanza el primer caso.Para listas de entrada más grandes, la función itera sobre cada elemento, agregándolo a
route
y llamando de forma recursiva arecurs
en los elementos restantes (y
). Después de cada llamada recursiva, se elimina el elemento agregado deroute
para prepararse para la siguiente iteración.La función principal
permutations
ahora llama arecurs
con los argumentosroute
ycities
iniciales, asegurando que la listaroute
se actualice con todas las permutaciones generadas. Finalmente, la función imprime cada permutación en la listaroute
formateada con los nombres de ciudad correspondientes en la listacity_names
.