Colabora
 

Combinaciones

[Generación de combinaciones en .NET]

 

Fecha: 15/Dic/2008 (14-12-08)
Autor: Héctor M Ochoa Jácome - [email protected]

http://hercoka-net.blogspot.com/

 


Introducción

El uso de combinaciones es un tema muy utilizado en la probabilidad y en los juegos de azar como la lotería, sin embargo la generación de estas combinaciones puede ser un tema difícil de entender y aplicar.

 

Combinaciones

Las combinaciones son un arreglo de objetos sin importar el orden, es decir, si un arreglo ya salio no puede volver a salir en cualquier otro orden. Las combinaciones se definen de un conjunto de N elementos tomados de r en r. Aquí la formula general.

C(N,r) = N! / (N-r)! r!
 

Este teorema también puede establecerse como sigue:

El número de subconjuntos diferentes de r elementos cada uno, que puede formarse a partir de un conjunto de N elementos.

Ejemplo:

Tenemos 9 envases decorados diferentes y solo 6 posiciones para acomodarlos, los envases deberán ser tomados de 6 en 6. Cuantos paquetes de 6 diferentes envases podremos formar.

 

El código:

Aquí una función recursiva que genera todas las posibles combinaciones.

Código en C#:

/// <summary>
/// Funcion recursiva que genera combinaciones de números de N en r
/// </summary>
/// <param name=t">Inicialmente se debe de pasar 1 y este automaticamente se va incrementando</param>"
/// <param name=N">Es el numero de elementos del Universo</param>"
/// <param name=r">Es el numero de elementos del grupo</param>"
/// <param name=x">Se utiliza para ir calculando en que numero de elemento vamos</param>"
/// <param name=Elem">Arreglo que contiene la colección de elementos de la combinación</param>"
/// <param name=strTex">Variable de texto donde se van mostrando las posibles combinaciones</param>"
void Ciclo(int t, int N, int r, int x, ref int[] Elem, ref string strTex)
{

    // Se repite hasta que t sea mayor que el número de formas posibles
    while (t <= (N - (r - x)))
    {
        // Se generaran r ciclos recursivos 
        if (r > x)
        {
            Elem[x-1] = t; 
            Ciclo((t + 1), N, r, (x + 1), ref Elem, ref strTex);
        }
        else
        {
            Elem[x-1] = t;
// Concatenamos la combinación for (int i = 0; i < x; i++) { strTex += Elem[i].ToString("[#,##0]"); } strTex += "\r\n"; } t++; } }

Forma en que se manda a llamar la función.

Código en C#:

// Declaramos variables
int N = 9;                  // Nueve envases
int r = 6;                  // Seis espacios
int[] Elem = new int[r];    // Vector de la Combinación
string strTex = "";         

// Iniciamos llamada recursiva a la función.
Ciclo(1, N, r, 1, ref Elem, ref strTex);

// Mostrar resultado en una caja de texto
txtCombina.Text = strTex;  

 



Compromiso del autor del artículo con el sitio del Guille:

Lo comentado en este artículo está probado (y funciona) con la siguiente configuración:

El autor se compromete personalmente de que lo expuesto en este artículo es cierto y lo ha comprobado usando la configuración indicada anteriormente.

En cualquier caso, el Guille no se responsabiliza del contenido de este artículo.

Si encuentras alguna errata o fallo en algún link (enlace), por favor comunícalo usando este link:

Gracias.


Código de ejemplo (comprimido):

 

Este artículo no tiene ningún código de ejemplo

 


Ir al índice principal de el Guille