Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente | Prochaine révision Les deux révisions suivantes | ||
combinatoire [2009/12/27 09:13] tyrtamos |
combinatoire [2009/12/29 10:15] tyrtamos |
||
---|---|---|---|
Ligne 590: | Ligne 590: | ||
[' | [' | ||
</ | </ | ||
+ | |||
+ | ==== Combinaisons avec répétition ==== | ||
+ | |||
+ | Jusqu' | ||
+ | |||
+ | Quand l'un des éléments au moins apparait plusieurs fois dans la liste des objets, il y a deux effets dans la liste des combinaisons. | ||
+ | |||
+ | Par exemple dans les combinaisons de [1,2,2] pris 2 à 2 qui donne [[1, 2], [1, 2], [2, 2]]: | ||
+ | |||
+ | * présence de séquences contenant des répétitions. Ici: [2,2] | ||
+ | |||
+ | * présence de séquences identiques. Ici: [1,2] et [1,2]. | ||
+ | |||
+ | Que peut-on faire avec ça? Tout dépendra de ce qu'on obtenir par rapport au problème à résoudre: | ||
+ | |||
+ | * on n'a pas de répétition dans la liste des objets de départ mais on en veut dans les résultats | ||
+ | |||
+ | * on a des répétitions dans la liste des objets de départ et on veut éliminer ses effets dans les résultats | ||
+ | |||
+ | Voyons ces 2 cas. | ||
+ | |||
+ | **__On veut des combinaisons avec répétition__** | ||
+ | |||
+ | Par exemple: on a [1,2,3], mais on veut obtenir une combinaison de ces 3 objets pris 2 à 2 **avec répétition** comme: %%[[1, 1], [1, 2], [2, 2], [1, 3], [2, 3], [3, 3]]%% | ||
+ | |||
+ | Il suffit de transformer la liste de départ en répétant chaque élément autant de fois que la combinaison cherchée le demande (ici, 2): [1,2,3] devient donc [1, | ||
+ | |||
+ | Combien cela va-t-il donner de séquence dans les résultats? Cela en donnera: | ||
+ | |||
+ | < | ||
+ | |||
+ | n étant le nombre d' | ||
+ | |||
+ | <code python> | ||
+ | Combin(3+2-1, | ||
+ | 6 | ||
+ | </ | ||
+ | |||
+ | Pour calculer la liste de ces combinaisons avec répétition, | ||
+ | |||
+ | <code python> | ||
+ | def repet(seq, m=-1): | ||
+ | """ | ||
+ | si m==0, renvoie seq sans rien changer | ||
+ | si m==-1 (défaut), chaque élément de seq apparait len(seq) fois | ||
+ | """ | ||
+ | if m == 0: | ||
+ | return seq[:] | ||
+ | if m == -1: | ||
+ | m = len(seq) | ||
+ | r = [] | ||
+ | for elem in seq: | ||
+ | if elem not in r: | ||
+ | for k in xrange(0, | ||
+ | r.append(elem) | ||
+ | return r | ||
+ | </ | ||
+ | |||
+ | Avec cette fonction, la liste d' | ||
+ | |||
+ | On peut faire la même chose avec une chaine de caractère. Par exemple, on veut la liste des mots de 3 lettres de l' | ||
+ | |||
+ | <code python> | ||
+ | ch = '' | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
===== Arrangement ===== | ===== Arrangement ===== |