Table des matières
É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.
siL=[1]alors on obtient[[1]]. - Si une liste contient
n > 1éléments,- on considère les
nlistesLiobtenues en permutantL[0]avecL[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
L0on obtient les permutations[[A, B, C], [A, C, B]] - pour
L1on obtient les permutations[[B, A, C], [B, C, A]] - pour
L2on 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.
