InicioCiencia EducacionPHP combinatoria sin repetición. Problema.
Estoy buscando un código en PHP que me permitar combinar números sin repetición. Algo genérico dónde se pueda meter la cantidad de símbolos.

Algo parecido a la calculadora que aparece en:
http://www.disfrutalasmatematicas.com/combinatoria/images/combinations-permutations.swf
No importa el órden y no se puede repetir.
Que se calcule desde 1 hasta el total de simbolos escogidos.

Por ejemplo: 6 simbolos.
Empecé a hacer esto (ver código más abajo). Pero no funciona bien:
Pero por ahí van los tiros !... La idea es que pueda calcular no solo 6 entradas sino 10, 20 y más...
Supongo que habrá que hacer una pirámide de Pascal o algo así... yo intenté algo parecido pero funcinoa hasta 5.

gracias !!.

<?php
//RECIBIMOS LA ENTRADA (6 valores)
$DATOS = array(
array('A','B','C','D','E','F'),
array('B','C','D','E','F','G'),
array('C','D','E','F','G','A'),
array('D','E','F','G','A','B'),
array('E','F','G','A','B','C'),
array('F','G','A','B','C','D'),

);
$entradas = count($DATOS);//Contamos las entradas
$valor1="";$valor2="";$valor3="";$valor4="";$valor5="";$valor6="";$valor7="";$resta=0;$salto=0;$linea=0; //Inicializamos valores a cero

//PRIMERA PARTE CALCULAMOS LAS COMBINACIONES POSIBLES.
$combinaciones = 0; $contador =1; $contador2= 1;

while ($contador <=$entradas):
//Combinación escogiendo r usadas
$usadas = $contador;

$diferencia = $entradas - $usadas;
$formula = factorial1($entradas)/((factorial2($usadas)*factorial3($diferencia)));//Combinaciones usando r simbolos
$combinaciones = $combinaciones + $formula; //Para acumular el total de combinaciones posibles

echo "<br><br><*** ";echo $formula;echo " ***>"; //
$contador2=1;$resta=0;$salto=0;

while ($contador2 <= ($formula)):
echo " ".$contador2."-";
//AUTOMATIZAR ESTA PARTE...
if ($contador2 > $entradas) {$resta = $entradas;$salto=1;};
if ($contador2 > 2*$entradas) {$resta = 2*$entradas;$salto=2;};
if ($contador2 > 3*$entradas) {$resta = 3*$entradas;$salto=3;};
if ($contador2 > 4*$entradas) {$resta = 4*$entradas;$salto=4;};
if ($contador2 > 5*$entradas) {$resta = 5*$entradas;$salto=5;};
if ($contador2 > 6*$entradas) {$resta = 6*$entradas;$salto=6;};
if ($contador2 > 7*$entradas) {$resta = 7*$entradas;$salto=7;};

if ($contador==1) { $valor1=$DATOS[$contador2-1][0]; };

if ($contador==2) { $valor1=$DATOS[$contador2-1-$resta][0];
$valor2=$DATOS[$contador2-1-$resta][$salto+1]; };

if ($contador==3) { $valor1=$DATOS[$contador2-1-$resta][0];
$valor2=$DATOS[$contador2-1-$resta][$salto+1];
$valor3=$DATOS[$contador2-1-$resta][$salto+1+1]; };

if ($contador==4) { $valor1=$DATOS[$contador2-1-$resta][0];
$valor2=$DATOS[$contador2-1-$resta][$salto+1];
$valor3=$DATOS[$contador2-1-$resta][$salto+1+1];
$valor4=$DATOS[$contador2-1-$resta][$salto+1+1+1]; };

if ($contador==5) { $valor1=$DATOS[$contador2-1-$resta][0];
$valor2=$DATOS[$contador2-1-$resta][$salto+1];
$valor3=$DATOS[$contador2-1-$resta][$salto+1+1];
$valor4=$DATOS[$contador2-1-$resta][$salto+1+1+1];
$valor5=$DATOS[$contador2-1-$resta][$salto+1+1+1+1]; };

if ($contador==6) { $valor1=$DATOS[$contador2-1-$resta][0];
$valor2=$DATOS[$contador2-1-$resta][$salto+1];
$valor3=$DATOS[$contador2-1-$resta][$salto+1+1];
$valor4=$DATOS[$contador2-1-$resta][$salto+1+1+1];
$valor5=$DATOS[$contador2-1-$resta][$salto+1+1+1+1];
$valor6=$DATOS[$contador2-1-$resta][$salto+1+1+1+1+1]; };


echo $valor1.$valor2.$valor3.$valor4.$valor5.$valor6.$valor7."- ";

$contador2 = $contador2 + 1;
endwhile;

$contador = $contador + 1;
endwhile;

echo "< C= ";echo $combinaciones;echo " >";
echo " <br> ";

//Las funciones afuera del bucle
function factorial1($entradas) {
if ($entradas == 0) return 1;
return $entradas * factorial1($entradas - 1);
}

function factorial2($usadas) {
if ($usadas == 0) return 1;
return $usadas * factorial2($usadas - 1);
}

function factorial3($diferencia) {
if ($diferencia == 0) return 1;
return $diferencia * factorial3($diferencia - 1);
}

?>
Datos archivados del Taringa! original
0puntos
0visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
3visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

a
Usuario
Puntos0
Posts1
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.