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.

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í.

Tags:  ,

Answer

  1. Avatar for 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:

    def foo(L, primero, ultimo, Salida):
        if primero >= ultimo:
            return
        for i in range(primero, ultimo):
            if (i != primero) or (Salida == []) or (Salida[-1] != L[0]):
                print(Salida+[L[i]])
                foo(L, primero+1, ultimo, Salida+[L[i]])
    
    foo([1,2,3], 0, 3, [])
    

    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 de Salida 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:

    [1]
    [1, 3]
    [2]
    [2, 3]
    [3]
    

    Una solución alternativa para lograr el mismo resultado utilizando funciones iterativas es:

    def foo(L, combinacion_excluida):
        Salida = []
        for i in range(len(L)):
            if L[i] not in combinacion_excluida:
                Salida.append([L[i]])
        for i in range(len(L)-1):
            if (L[i], L[i+1]) != combinacion_excluida:
                Salida.append([L[i], L[i+1]])
        return Salida
    
    foo([1,2,3], (1,2))
    

    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 lista Salida 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 actual L[i] y el siguiente elemento L[i+1]. Esta sublista se agrega a la lista Salida 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:

    [[1], [1, 3], [2], [2, 3], [3]]
    

Comments are closed.