Tout d'abord, ça sent comme récursion bien sûr !
Comme vous vouliez aussi connaître le principe, j'ai fait de mon mieux pour l'expliquer en langage humain. Je pense que la récursion est très facile la plupart du temps. Vous n'avez que deux étapes à saisir :
- La première étape
- Toutes les autres étapes (toutes avec la même logique)
Sur le langage humain :
En bref :
-
La permutation d'un élément est un élément.
-
La permutation d'un ensemble d'éléments est une liste de chacun des éléments, concaténée avec chaque permutation des autres éléments.
Exemple :
Si l'ensemble n'a qu'un seul élément -->
le rendre.
perm(a) -> a
Si l'ensemble a deux caractères : pour chaque élément de l'ensemble : retourner l'élément avec la permutation des éléments le reste des éléments, comme ceci :
perm(ab) ->
a + perm(b) -> ab
b + perm(a) -> ba
En outre : pour chaque caractère de l'ensemble : retour d'un caractère, concaténé avec une permutation du > reste de l'ensemble
perm(abc) ->
a + perm(bc) --> abc , acb
b + perm(ac) --> bac , bca
c + perm(ab) --> cabine , cba
perm(abc...z) -->
a + perm(...), b + perm(....)
....
J'ai trouvé le pseudo-code sur http://www.programmersheaven.com/mb/Algorithms/369713/369713/permutation-algorithm-help/ :
makePermutations(permutation) {
if (length permutation < required length) {
for (i = min digit to max digit) {
if (i not in permutation) {
makePermutations(permutation+i)
}
}
}
else {
add permutation to list
}
}
C#
OK, et quelque chose de plus élaboré (et puisque c'est étiqueté c #), de http://radio.weblogs.com/0111551/stories/2002/10/14/permutations.html : Plutôt long, mais j'ai décidé de le copier quand même, pour que le post ne soit pas dépendant de l'original.
La fonction prend une chaîne de caractères, et écrit toutes les permutations possibles de cette chaîne exacte, donc par exemple, si "ABC" a été fourni, devrait se déverser :
ABC, ACB, BAC, BCA, CAB, CBA.
Code :
class Program
{
private static void Swap(ref char a, ref char b)
{
if (a == b) return;
var temp = a;
a = b;
b = temp;
}
public static void GetPer(char[] list)
{
int x = list.Length - 1;
GetPer(list, 0, x);
}
private static void GetPer(char[] list, int k, int m)
{
if (k == m)
{
Console.Write(list);
}
else
for (int i = k; i <= m; i++)
{
Swap(ref list[k], ref list[i]);
GetPer(list, k + 1, m);
Swap(ref list[k], ref list[i]);
}
}
static void Main()
{
string str = "sagiv";
char[] arr = str.ToCharArray();
GetPer(arr);
}
}
1 votes
Voici une question sur les permutations avec quelques bonnes réponses explicatives, y compris un graphique mais pas en C#.