====== Énumération des permutations d'une liste ======
On prend une liste, par exemple ''L = [1, 2, 3]'', et on voudrait donner la liste de toutes les « permutations » que l'on peut faire.
Par exemple, pour ''L = [1, 2, 3]'', on obtiendrait ''%%[[1, 2, 3], [2, 3, 1], [3, 1, 2], [1, 3, 2], [3, 2, 1], [2, 1, 3]]%%''.
On utilise pour cela un algorithme récursif.
* Pour une liste qui ne contient qu'un élément, il n'y a rien à faire.\\ si ''L=[1]'' alors on obtient ''%%[[1]]%%''.
* Si une liste contient ''n > 1'' éléments,
* on considère les ''n'' listes ''Li'' obtenues en permutant ''L[0]'' avec ''L[i]''
* on détermine toutes les permutations en ne considérant que les items de rangs ''2:n'',
Exemple pour ''n = 3'', ''L = [A, B, C]'',
* On détermine ''L0 = [A, B, C]'', ''L1 = [B, A, C]'', ''L3 = [B, C, A]''
* pour ''L0'' on obtient les permutations ''%%[[A, B, C], [A, C, B]]%%''
* pour ''L1'' on obtient les permutations ''%%[[B, A, C], [B, C, A]]%%''
* pour ''L2'' on obtient les permutations ''%%[[C, B, A], [C, A, B]]%%''
On a ainsi obtenu toutes les permutations possibles de ''[A, B, C]''.
Il y a donc **récursivité** puisque pour obtenir les permutations de ''n'' items, on doit calculer les permutations de ''n-1'' items.
===== fonction récursive =====
Pour l'implémentation de cet algorithme en Python, on commence par créer une fonction récursive ''permute(L, i, result)'' qui permute les éléments de la liste ''L'' en laissant fixes les éléments d'indices strictement inférieurs à ''i'' et ajoute à la liste ''result'' des permutations déjà obtenues la nouvelle permutation ainsi créée.
On remarquera que lorsque ''i == len(L)-1'', on se contente d'ajouter ''L'' à ''result''.
FONCTION permute
ENTRÉES:
L: liste dont on veut les permutations
i: les items de rang <= i restent à leur place
result: tableau, collecte les permutations trouvées
DÉBUT
soit n le nombre d'items de L
SI i est n - 1 ALORS
ajouter L au bout de result
FIN
POUR j allant de i à n-1 FAIRE
permuter les items de rang i et j dans L
... complétez
permuter les items de rang j et i dans L
FIN
FIN
===== fonction qui amorce la récurrence =====
Dans une fonction ''permutations(L)'' on initialise la liste attendue des permutations à ''pmt = []'', puis on lance ''permute(L, 0, pmt)'' et on retourne ''pmt'' en fin du processus récursif.
def permutation(L):
pmt = []
permute(L, 0, pmt)
return pmt
**À faire :** Faites l'implémentation et testez.