Saltar al contenido

Obtener todas las combinaciones posibles de una lista de números

Si encuentras algún fallo en tu código o trabajo, recuerda probar siempre en un ambiente de testing antes aplicar el código al trabajo final.

Solución:

Simplemente incremente un número binario y tome los elementos correspondientes a los bits que se establecen.

Por ejemplo, 00101101 significaría tomar los elementos en los índices 0, 2, 3 y 5. Dado que su lista es simplemente 1..n, el elemento es simplemente el índice + 1.

Esto generará permutaciones en orden. En otras palabras, sólo 1, 2, 3 se generará. No 1, 3, 2 o 2, 1, 3 o 2, 3, 1etc.

No es mi código, pero estás buscando el powerset. Google me dio esta solución, que parece funcionar:

public IEnumerable> GetPowerSet(List list)

    return from m in Enumerable.Range(0, 1 << list.Count)
              select
                  from i in Enumerable.Range(0, list.Count)
                  where (m & (1 << i)) != 0
                  select list[i];

Fuente: http://rosettacode.org/wiki/Power_set#C.23

Esto es algo que he escrito en el pasado para lograr tal tarea.

List CreateSubsets(T[] originalArray) 
 
    List subsets = new List(); 

    for (int i = 0; i < originalArray.Length; i++) 
     
        int subsetCount = subsets.Count; 
        subsets.Add(new T[]  originalArray[i] ); 

        for (int j = 0; j < subsetCount; j++) 
         
            T[] newSubset = new T[subsets[j].Length + 1]; 
            subsets[j].CopyTo(newSubset, 0); 
            newSubset[newSubset.Length - 1] = originalArray[i]; 
            subsets.Add(newSubset); 
         
     

    return subsets; 

Es genérico, por lo que funcionará para enteros, largos, cadenas, Foos, etc.

Aquí puedes ver las reseñas y valoraciones de los usuarios

Si conservas alguna suspicacia o capacidad de beneficiar nuestro crónica puedes dejar una nota y con gusto lo analizaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *