na, lo he hecho en php, y me ha quedado algo así:
<?php
set_time_limit(500);
function combinaciones( $arrayExplode, $itemsRestantes, $arrayUsados, $indice, &$resultados ){
if(count($itemsRestantes)>0)
for($i=count($itemsRestantes)-1;$i>=0;$i--){
$k=0;
$arrayUsados[$indice]=$itemsRestantes[$i];
foreach($itemsRestantes as $clave=>$valor){
if($clave!==$i){
$aux2[$k]=$valor;
$k++;
}
}
if(count($aux2)>0){
combinaciones( $arrayExplode, $aux2, $arrayUsados, $indice+1, $resultados);
array_unique($arrayUsados);
$cadena="";
$imprimido=1;
foreach($arrayUsados as $clave=>$valor){
$cadena.=$valor." ";
}
$resultados[]=$cadena;
}
}
array_unique($arrayUsados);
if($imprimido!=1){
$cadena="";
foreach($arrayUsados as $clave=>$valor){
$cadena.=$valor." ";
}
$resultados[]=$cadena;
}
return 0;
}
$cadena="1 2 3 4 5 6 7 8";
$array_explode=explode(" ",$cadena);
$array_usados=array();
$resultados=array();
$quitados=array();
$time1=microtime();
/*PRE: Els dos primers parámetros son el propi array de la frase despues de fer el explode, el tercer parámetro es un array buit,
el 4º parámetro sempre val 0, y el últim es un array buit que será on es guardarán els resultats*/
combinaciones( $array_explode, $array_explode, $array_usados, 0, $resultados);
$time2=microtime();
$time=$time2-$time1;
foreach($resultados as $clave=>$valor){
echo "[ ".$valor." ]<br>";
}
echo "Tiene ".count($resultados)." combinaciones";