2013-02-21 12 views
2

Je ne sais pas comment expliquer. Mais peut-être que l'exemple ci-dessous vous rendra compréhensible quel est mon problème.Permutation de factorielle en php

Exemple:

j'ai un tableau avec 3 éléments.

$elements = array('A', 'B', 'C'); 

La permutation sera de 3 à 3. donc le résultat sont:

A-B-C ; A-C-B ; B-A-C ; B-C-A ; C-A-B; C-B-A 

Je ne veux pas toute permutation 2 en 3 ou 1 à 3, à seulement 3 à 3 que vous pouvez voir par exemple. Donc, si j'ai 4 éléments dans un tableau, la permutation est 4 sur 4. Et ainsi de suite ...

(Je pense que le nombre de permutations est 3! = 1 * 2 * 3 = 6 permutations, 4! = 1 * 2 * 3 * 4 = 24 permutations ... que pourquoi j'appelle permutations factoriel.)

S'il y a d'autres questions-réponses similaire à mon problème, s'il vous plaît laissez-moi savoir

+0

Je ne sais pas comment commencer avec ça! – Kannika

Répondre

5

Utilisez une fonction récursive :

function permutations($elements) { 
    if(count($elements)<2) return $elements; 

    $newperms= array(); 
    foreach($elements as $key=>$element) { 
     $newelements= $elements; 
     unset($newelements[$key]); 

     $perms= permutations($newelements); 
     foreach($perms as $perm) { 
      $newperms[]= $element."-".$perm; 
     } 
    } 
    return $newperms; 
} 

n'a pas testé, donc il y a encore du travail pour vous ;-)

+1

+1 pour une solution rapide et agréable :) –

+0

Solution intelligente! – Atticus

+0

merci @Adder^_^et stackoverflow :) – Kannika

2

Vous ne savez pas exactement ce dont vous avez besoin, mais essayez-vous de produire ces permutations?

Cela devrait vous aider à démarrer, il effectuera une permutation complète sur tout ensemble de taille dont vous avez besoin. Ajout de quelques annotations, vous devriez être en mesure d'obtenir l'idée

$array = array('A','B','C', 'D'); 
$permutations = array($array); 
$perm_pool = range(0, count($array)-1); 

function getPermutation($p, $size){ 
    // we pass in an array of integers, basically pointers, we want to see when we've fully reversed the set 
    for ($i = $size-1; $p[$i] >= $p[$i+1]; $i--){} 
    // the array starts at [1,2,3,4], when we've reached [4,3,2,1], we're done. 
    if ($i == -1) { return false; } 

    // slide down to the next largest number, this will be our next swap 
    for ($j = $size; $p[$j] <= $p[$i]; $j--) {} 

    // swap it 
    $tmp = $p[$i]; 
    $p[$i] = $p[$j]; 
    $p[$j] = $tmp; 

    // reverse the arrangement by swapping the head and tails 
    for ($i++, $j = $size; $i < $j; $i++, $j--){ 
     $tmp = $p[$i]; 
     $p[$i] = $p[$j]; 
     $p[$j] = $tmp; 
    } 
    return $p; 
} 

$i=1; 
while($perm_pool=getPermutation($perm_pool, count($array)-1)){ 
    foreach($perm_pool as $p){ 
     $permutations[$i][] = $array[$p]; 
    } 
    $i++; 

} 
+0

seulement 23 sont là, il devrait y avoir 24 –

+0

Ah oui, l'ensemble de permutation n'incluait pas l'ensemble d'origine. Check edit - l'a ajouté à l'ensemble de permutation initial, et décale la boucle while de 1. – Atticus

+0

+1 pour Nice logic –