Algorithme récursif simple en Haskell
import Data.List
combinations 0 lst = [[]]
combinations n lst = do
(x:xs) <- tails lst
rest <- combinations (n-1) xs
return $ x : rest
Nous définissons d'abord le cas particulier, c'est-à-dire la sélection de zéro élément. Il produit un seul résultat, qui est une liste vide (c'est-à-dire une liste qui contient une liste vide).
Pour n > 0, x
parcourt chaque élément de la liste et xs
est chaque élément après x
.
rest
picks n - 1
des éléments de xs
en utilisant un appel récursif à combinations
. Le résultat final de la fonction est une liste dont chaque élément est x : rest
(c'est-à-dire une liste qui a x
comme chef et rest
comme queue) pour chaque valeur différente de x
y rest
.
> combinations 3 "abcde"
["abc","abd","abe","acd","ace","ade","bcd","bce","bde","cde"]
Et bien sûr, comme Haskell est paresseux, la liste est générée progressivement selon les besoins, de sorte que vous pouvez évaluer partiellement des combinaisons de taille exponentielle.
> let c = combinations 8 "abcdefghijklmnopqrstuvwxyz"
> take 10 c
["abcdefgh","abcdefgi","abcdefgj","abcdefgk","abcdefgl","abcdefgm","abcdefgn",
"abcdefgo","abcdefgp","abcdefgq"]
4 votes
Une préférence pour un langage de programmation ?
9 votes
Comment voulez-vous traiter les lettres en double ?
0 votes
Pas de préférence de langage, je vais le coder en ruby mais une idée générale des algorithmes à utiliser serait bien. Deux lettres de même valeur peuvent exister mais pas la même lettre deux fois.
0 votes
Solution flash as3 stackoverflow.com/questions/4576313/
0 votes
En php, ce qui suit devrait faire l'affaire : stackoverflow.com/questions/4279722/
0 votes
Un peu de ma sagesse Le programme mentionné dans le lien peut être étendu pour résoudre tout problème de nature exponentielle. Voici la structure de base. chamanchindi.blogspot.in/2008/10/
0 votes
Abacus (sur github) une bibliothèque de combinatoire pour Node.JS, Python, PHP, Actionscript (ps je suis l'auteur)
0 votes
@wcm Je n'ai pas trouvé de solution ici pour traiter les lettres en double. Je suis allé de l'avant et j'ai répondu à la question nécessitant les doublons (et nécessitant du C++) : stackoverflow.com/q/29967202/2642059
0 votes
Il y a un bon article convaincant avec ce qui semble être une implémentation efficace en C# ici : msdn.microsoft.com/fr/us/library/aa289166(v=vs.71).aspx