Passer par toutes les permutations d'un ensemble récursivement
Je suis en train d'écrire une fonction récursive pour produire toutes les permutations d'un tableau.
static int permus[] = new int[] { 1, 2, 3, 4, 5 };
static void testPermu(int start)
{
//Print it
System.out.println(Arrays.toString(permus));
int k;
for (int i = start + 1; i < permus.length; i++) {
//swap
k = permus[start];
permus[start] = permus[i];
permus[i] = k;
testPermu(i);
//unswap
k = permus[start];
permus[start] = permus[i];
permus[i] = k;
}
}
Il est invoqué comme testPermu(0)
et devrait produire toutes les permutations, cependant cela ne fonctionne pas. Comment puis-je résoudre ce problème?
Il doit être récursive, chaque fois que la fonction est appelée, elle doit obtenir une nouvelle permutation.
de sortie est maintenant
[1, 2, 3, 4, 5] [2, 1, 3, 4, 5] [2, 3, 1, 4, 5] [2, 3, 4, 1, 5] [2, 3, 4, 5, 1] [2, 3, 5, 4, 1] [2, 4, 3, 1, 5] [2, 4, 3, 5, 1] [2, 5, 3, 4, 1] [3, 2, 1, 4, 5] [3, 2, 4, 1, 5] [3, 2, 4, 5, 1] [3, 2, 5, 4, 1] [4, 2, 3, 1, 5] [4, 2, 3, 5, 1] [5, 2, 3, 4, 1]
Vous pouvez voir que beaucoup de permutations sont manquants.
Je vais écrire en Java, mais je vais comprendre, par exemple en C, javascript ou autre chose tant qu'il ne l'utilise pas certains de la bibliothèque de trucs, non disponible en Java.
Voir ici. Je voudrais essayer de le modèle de mon code par la suite. Je ne suis pas sûr, mais je pense que vos problèmes pourraient être découlant de l'utilisation d'un unique tableau statique.
Je suis tout à fait certain que l'exemple que vous avez lié utilise également le même tableau de partout, c'est passé par référence. Je vais essayer de copier cette approche (qui semble être en grande partie le même que le mien :D)
Dans ce cas, votre question doit être marqué comme un doublon.
Je suis tout à fait certain que l'exemple que vous avez lié utilise également le même tableau de partout, c'est passé par référence. Je vais essayer de copier cette approche (qui semble être en grande partie le même que le mien :D)
Dans ce cas, votre question doit être marqué comme un doublon.
OriginalL'auteur MightyPork | 2015-03-01
Vous devez vous connecter pour publier un commentaire.
Voici un exemple complet:
OriginalL'auteur Eric Wang
Trois corrections sont nécessaires afin de travailler:
(start == permus.length-1)
, sinon, vous allez voir des doublonsfor
boucle dei = start
, pasi = start + 1
testPermu(start + 1);
au lieu detestPermu(i);
OriginalL'auteur Miljen Mikic
@Enric solution est gentil, mais en utilisant une solution ci-dessous, nous pouvons éviter de 80 swaps et d'effectuer seulement 24 swaps.
OriginalL'auteur Ankush G
Une autre approche:
Cette méthode sélectionne d'abord un élément, l'enlève et obtient une sous-liste, puis produit une permutation de la sous-liste jusqu'à ce que la taille de la liste devient 1.
OriginalL'auteur tonychow0929
Essayer avec
OriginalL'auteur Luka Rahne
J'aime @tony200910041 approche, mais peut-être que quelqu'un désire une plus propre et plus générique version:
Le tri de la liste avant de passer à l'
getPermutations()
fonction si vous voulez que votre permutations dans l'ordre croissant.OriginalL'auteur Oneiros
Vous pouvez le faire simplement sans récursivité
OriginalL'auteur Darren
Comment au sujet de la suite de l'algorithme (en pseudo-code)
Cela doit produire un valide permutation à chaque exécution. Si vous voulez que toutes les permutations possibles, tout s'accumulent à mesure que vous parcourez, alors vous devriez avoir toutes les permutations.
OriginalL'auteur posdef