Función recursiva para generar el conjunto potencia secuencialmente en Python.
Lo que espero para [1,2,3] ->
[1]
[1, 2]
[1, 2, 3]
[1, 3]
[2]
[2, 3]
[3]
pero mi función da este resultado, no puedo arreglarlo ->
def foo(L, primero, ultimo, Salida):
if primero >= ultimo:
return
for i in range(primero, ultimo):
print(Salida + [L[i]])
foo(L, primero + 1, ultimo, Salida + [L[i]])
foo([1,2,3],0,3,[])
[1]
[1, 2]
[1, 2, 3]
[1, 3]
[1, 3, 3]
[2]
[2, 2]
[2, 2, 3]
[2, 3]
[2, 3, 3]
[3]
[3, 2]
[3, 2, 3]
[3, 3]
[3, 3, 3]
y en algunas situaciones quiero detener el cálculo y continuar con otros:
digamos que si 1 y 2 se encuentran juntos, ya no se debe continuar
-> para [1,2,3] y (1,2)
lo que espero:
[1]
[1, 3]
[2]
[2, 3]
[3]
una función iterativa también es buena para mí.
davy.ai
La función original está utilizando recursión y está generando todas las posibles combinaciones de la lista dada sin considerar ninguna condición específica. La salida generada es una combinación de todas las sub-listas posibles de la lista dada.
Para lograr la salida deseada de omitir la sublista [1,2], podemos modificar la condición del bucle for para excluir el índice 1 cuando el índice 0 es seleccionado. Esto se puede hacer de la siguiente manera:
En la función modificada, se ha agregado una condición adicional al bucle for, que verifica las combinaciones donde
L[i]
es igual a 2 y el último elemento deSalida
es igual a 1. Esta condición asegura que la combinación [1,2] no se genere.La salida generada por la función modificada para la entrada [1,2,3] y la condición [1,2] es:
Una solución alternativa para lograr el mismo resultado utilizando funciones iterativas es:
En esta función modificada, la combinación excluida se pasa como argumento. La función recorre todos los elementos de la lista dada
L
y los agrega a la listaSalida
si no están en la combinación excluida.A continuación, la función recorre la lista nuevamente utilizando un rango desde 0 hasta uno menos que la longitud de
L
. En cada iteración, genera una sublista que contiene el elemento actualL[i]
y el siguiente elementoL[i+1]
. Esta sublista se agrega a la listaSalida
si no es igual a la combinación excluida.La salida generada por la función iterativa modificada para la entrada [1,2,3] y la condición [1,2] es: