Pues el problema es que hice una funcion en php para, supuestamente, valiendome de un arreglo crear todas las permutaciones posibles con los valores contenidos en el, si son 3 los valores el programa debe crear tantas permutaciones con esos tres caracteres como el resultado de 3!(factorial), pues tres el el total de valores, sin repetir los valores en las permutaciones. O sea que si los valores del arreglo son (1, 2, 3) no es valida la permutacion "112", pues el resultado para ello deveria ser un arreglo asi array("123", "132", "213", "231", "312", "321"), mi principal problema, es que no logro evitar las repeticiones. Yo, como siempre, supongo que mi codigo esta bien, pero no funciona como se supone, por eso, y esperando que sus aportes me sean de utilidad, les dejo aqui la "mentada" funcion:
<?php
function permutaciones($caracteres)//El parametro que la funcion recibe es un arreglo
{
//Se obtiene la cantidad de valores, pues para saber cuantas permutaciones
//nos permite hacer el arreglo necesitamos sacar el factorial de la cantidad
//de valores contenidos en el arrego
$cant_valores=0;
foreach($caracteres as $a)
{
$cant_valores+=1;
}
//Funcion para sacar el factorial
function factorial($cant)
{
$f=1;
for($c=1; $c <= $cant; $c++)
{
$f*=$c;
}
return $f;
}
$factor=factorial($cant_valores);
//Declaro el arreglo que contendra las permutaciones de los indices
//para hacer referencia a los valores
for($x = 0; $x < $factor; $x++)
{
for($y = 0; $y < $cant_valores; $y++)
{
$result[$x][$y]="";
}
}
//Este primer while sirve para hacer las permutaciones y compararlas
//de modo que no se repitan
$a=0;
while($a < $factor)
{
$asignacion=true;//Con esta variable luego definire si la permutacion es valida para asignarla
$b=0;
while($b < $cant_valores)//El while que sirve para construir las permutaciones
{
$char = mt_rand(0,$cant_valores-1);//Genero valores al azarpara permutar
$asignar=true;//Con esta variable luego definire si el valor es valido para asignarlo
for($y = 0; $y < $cant_valores; $y++)
{
if($char==$result[$a][$y])//Si el valor ya esta contenido en la permutacion no se asigna
{
$asignar=false;
break;
}
}
if($asignar)//Si no lo esta, se adiere a la posible permutacion y se
//aumenta $b para pasar al siguiente valor de la permutacion
{
$posible[$a][$b]=$char;
$b+=1;
}
}
//Las permutaciones se evaluan igual que los valores, para serciorarse de que no las hayan repetidas
for($x = 0; $x < $factor; $x++)
{
if($posible[$a]==$result[$x])//Si la posible permutacion es igual a una ya existente no se asigna
{
$asignacion=false;
break;
}
}
if($asignacion)//Si no lo es, se adiere al resultado y se aumenta $a para pasar a la siguiente
{
$result[$a]=$posible[$a];
$a+=1;
}
}
//Como las permutaciones se han hecho con los indices del arreglo, es necesario pasarlas a los valores del arreglo
$permutaciones=array();
for($x = 0; $x < $factor; $x++)
{
for($y = 0; $y < $cant_valores; $y++)
{
$index=$result[$x][$y];//Se utiliza el resultado para obtener el indice deseado
$permutaciones[$x] .= $caracteres[$index];//Con el indice se hace referencia al valor del arreglo original
//el cual se concatena al arreglo $permutaciones que muestra el resultado
}
}
return $permutaciones;//Nos devuelve un arreglo
}
?>
Solo espero haberla comentado bien, de modo que se comprenda el desorden que he hecho
Postdata: Si de casualidad alguien me puede dar una funcion para generar permutaciones que sea mas sencilla, con gusto la acepto, porque me urge, ya que ademas de todo la mia es muy lenta