Ver Mensaje Individual
  #24 (permalink)  
Antiguo 26/12/2011, 05:33
Asgaard
 
Fecha de Ingreso: mayo-2010
Mensajes: 3
Antigüedad: 14 años
Puntos: 1
Respuesta: Generar todas las combinaciones posibles

Saludos,

no sé si el tema ya está algo viejo, pero intento aportar mi granito de arena.

Creo que para un número de palabras de longitud "n" la única solución viable es mediante la técnica de recursividad. Os muestro mi código y os comento:

Código PHP:
$longitud "2";
$caracteres = array("0","1","2","3","4","5","6","7","8","9",
                    
"a","b","c","d","e","f","g","h","i","j",
                    
"k","l","m","n","o","p","q","r","s","t",
                    
"u","v","w","x","y","z"); 

function 
getCadena($cad,$long)
{
    global 
$caracteres;
    
    if (
$long == "0")
    {
        echo (
$cad."\n");
    }
    else
    {
        for (
$i=0;$i<count($caracteres);$i++)
        {
            
$caracter $caracteres[$i];
            
$aux $cad.$caracter;
            
getCadena($aux,$long-1);
        }
    }
}

getCadena("",$longitud); 
$longitud es la variable que indica la longitud de la palabra, está puesta a 2 para que no machaque mucho la memoria, podeis pasar la salida a un archivo como se ha dicho antes, etc...

$caracteres indica todo el universo de caracteres que se van a usar, aquí se introducen letras además de números.

getCadena es la función recursiva, a la cual se le pasan dos parámetros, uno la cadena actual de salida, y otro la longitud de las subcadenas restantes.

básicamente es un funcionamiento muy sencillo, para formar una cadena de palabras de 5 caracteres de longitud, debemos usar todas las letras y combinarlo con todas las subcadenas de 4 caracteres de longitud...

De esta manera, la condición de salida será cuando debamos formar subcadenas de 0 caracteres, momento en el cual pintamos por pantalla la palabra formada.

la condición recursiva es sencilla, recorremos todo el array de caracteres posibles, y para cada uno, llamamos a la función getCadena, pero de longitud -1 y con el caracter actual uniéndolo a la cadena.

Probarlo si quereis, yo le he estado haciendo pruebas y funciona bastante bien...