Autor Tema: [resuelto] ayuda con funcion php  (Leído 8960 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado 0rion

  • MiembrosReales
  • *
  • Mensajes: 46
[resuelto] ayuda con funcion php
« : abril 03, 2010, 11:45:06 pm »
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:
Código: [Seleccionar]
<?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  :phew:
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  :phew:
« Última Modificación: abril 14, 2010, 01:08:16 pm por vlad »


Desconectado 0rion

  • MiembrosReales
  • *
  • Mensajes: 46
Re:ayuda con funcion php
« Respuesta #1 : abril 04, 2010, 11:48:08 am »
Gracias ~, seguramente lo podre usar para solucionar mi problema. Si supiera como darte buen karma te lo doy :sur:


Desconectado 0rion

  • MiembrosReales
  • *
  • Mensajes: 46
Re:ayuda con funcion php
« Respuesta #2 : abril 04, 2010, 11:55:45 am »
Aqui modifique el codigo para que acepte tanto arreglos como cadenas, por si a alguien mas le llega a servir, en lo personal, me parece una funcion muy util, ademas que me acaba de salvar el pellejo con mi tarea  :phew:
 :sur: Gracias a los communiters que me han ayudado antes con mis problemas, de no ser por ellos no sabria lo que se (aunque aun no se mucho  :phew: ), talvez algun dia sea yo quien solucione los problemas de otros :azn: , pero seran ustedes a travez de mi, quienes ayuden a los demas  :thumbsup:

Código: [Seleccionar]
<?php

function permutar($input)//Input puede ser cadena o array de una dimension
{
 
$str="";
 if(
is_array($input))//Si es arreglo se convierte a cadena
 
{
    foreach(
$input as $char)
    {
       
$str.=$char;
    }
 }else
 {
    
$str=$input;//Si no, solo se asigna a $str
 
}
 
/* Si solo tenemos un caracter, regresarlo */
 
if (strlen($str) < 2)
 {
     return array(
$str);
 }

 
/* Inicializar el arreglo a regresar */
 
$permutaciones = array();

 
/* Copiar la cadena menos el primer caracter */
 
$cola substr($str1);

 
/* Atravesar las permutaciones del substring que acabamos de crear */
 
foreach (permutar($cola) as $permutacion)
 {
   
/* Obtener la longitud de la permutación actual */
   
$longitud strlen($permutacion);

   
/* Atravesar la permutacion e insertar el primer caracter de
   la cadena original entre las dos partes y ponerlo en el arreglo
   a regresar */
   
for ($i 0$i <= $longitud$i++)
   {
     
$permutaciones[] = substr($permutacion0$i) . $str[0] . substr($permutacion$i);
   }
 }


 
/* Regresar el resultado */
 
return $permutaciones;
}
?>