Le langage de programmation n'étant pas mentionné, je suppose que les listes sont également acceptables. Voici donc une version OCaml adaptée aux listes courtes (non récursive en queue). Étant donné une liste l d'éléments de tout et un nombre entier n il retournera une liste de toutes les listes possibles contenant n éléments de l si nous supposons que l'ordre des éléments dans les listes résultantes est ignoré, c'est-à-dire que la liste ['a';'b'] est la même que ['b';'a'] et sera signalée une fois. Ainsi, la taille de la liste résultante sera ((Liste.longueur l) Choisir n).
L'intuition de la récursion est la suivante : vous prenez la tête de la liste et faites ensuite deux appels récursifs :
- appel récursif 1 (RC1) : vers la queue de la liste, mais choisir n-1 éléments
- appel récursif 2 (RC2) : vers la queue de la liste, mais choisir n éléments
pour combiner les résultats récursifs, on multiplie par liste (attention au nom bizarre) la tête de la liste avec les résultats de RC1, puis on ajoute (@) les résultats de RC2. La multiplication de listes est l'opération suivante lmul
:
a lmul [ l1 ; l2 ; l3] = [a::l1 ; a::l2 ; a::l3]
lmul
est implémenté dans le code ci-dessous comme
List.map (fun x -> h::x)
La récursion se termine lorsque la taille de la liste est égale au nombre d'éléments que vous voulez choisir, auquel cas vous renvoyez simplement la liste elle-même.
Voici donc une ligne de quatre en OCaml qui implémente l'algorithme ci-dessus :
let rec choose l n = match l, (List.length l) with
| _, lsize when n==lsize -> [l]
| h::t, _ -> (List.map (fun x-> h::x) (choose t (n-1))) @ (choose t n)
| [], _ -> []
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