2010-03-27 7 views
2

Je travaille sur un algorithme pour obtenir des permutations commeest-il possible de régler dynamiquement le niveau de boucle de nidification

123 
132 
213 
231 
312 
321 

Je le fais en utilisant des boucles foreach imbriquées.

for (..) { 
    for(..) { 
     for(..) { 
      echo $i . $j . $k . "<br />"; 
     } 
    } 
} 

Le nombre de boucles imbriquées est optimisé pour les permutations à 3 points. Comment puis-je définir dynamiquement le nombre de boucles imbriquées pour générer des permutations de 4 ou 5 lettres?

Répondre

2

La méthode récursive est la voie à suivre. Mais vous pouvez aussi utiliser la fonction eval comme:

$loop = iteration('i',10) . iteration('j',10). iteration('k',10). iteration('l',10); 
$loop .= "print \"\$i \$j \$k \$l\\n\";"; 

// $loop now has: for($i=0;$i<10;$i++)for($j=0;$j<10;$j++)for($k=0;$k<10;$k++)for($l=0;$l<10;$l++) print "$i $j $k $l\n"; 
eval($loop); 

function iteration($var,$limit) { 
    return "for(\${$var}=0;\${$var}<$limit;\${$var}++)";  
} 
0

La réponse est: utilisez une fonction récursive.

0

Vous pouvez utiliser une fonction récursive. Jetez un oeil à ce post.

4

Oui, il suffit de faire récursive.

function permuteThis($items, $permutations = array()) { 

    if(!is_array($items)) 
     $items = str_split($items); 

    $numItems = sizeof($items); 

    if($numItems > 0) { 
     $cnt = $numItems - 1; 
     for($i = $cnt; $i >= 0; --$i) { 
      $newItems = $items; 
      $newPerms = $permutations; 
      list($tmp) = array_splice($newItems, $i, 1); 
      array_unshift($newPerms, $tmp); 
      permuteThis($newItems, $newPerms); 
     } 
    } else { 
     echo join('', $permutations) . "\n"; 
    } 
} 

$number = 123; 
permuteThis($number);