J'ai une question qui est similaire, mais pas identique, à celui répondu ici. p>
Je voudrais une fonction de générer tous les k em> -ensembles des éléments d'une liste d'éléments n. Notez que je suis à la recherche des combinaisons, des permutations pas, et que nous avons besoin d'une solution pour faire varier k em> (à savoir coder en dur les boucles est un non-non). P>
Je cherche une solution qui est a) élégant et b) peuvent être écrites en langage VB10 / .Net 4.0. P>
Cela signifie a) des solutions nécessitant LINQ sont ok, b) ceux qui utilisent la commande C # "rendement" ne sont pas. P>
L'ordre des combinaisons est pas important (à savoir, lexicographique, code Gray, ce que vous voudrez) et de l'élégance est favorisée par rapport à la performance, si les deux sont en conflit. P>
(Les solutions OCaml et C # ici a> serait parfait, si elles peuvent être codées en VB10.) p>
5 Réponses :
J'ai essayé de créer un énumérable qui peut accomplir cette tâche dans VB. C'est le résultat: ... et vous pouvez utiliser mon code de cette façon: p> mon code donne des combinaisons d'une Longueur (3 dans mon exemple) Cependant, je viens de réaliser que vous souhaitez avoir des combinaisons de toute longueur (je pense), mais c'est un bon départ. P> P>
Je peux offrir la solution suivante - pas encore parfaite, pas rapide, et elle suppose que l'entrée est un ensemble, mais ne contient aucun élément en double. Je vais ajouter quelques explications plus tard.
1110000|1000110...
Ce n'est pas clair pour moi dans quelle forme vous souhaitez que votre code VB renvoie les combinaisons qu'il génère, mais pour la simplicité suppose une liste de listes. VB autorise la récursion et une solution récursive est la plus simple. Faire des combinaisons plutôt que des permutations peut être facilement obtenue, en respectant simplement la commande de la liste d'entrée.
Ainsi, les combinaisons d'articles K à partir d'une liste l que n articles sont longs sont les suivants: P>
en pseudocode (en utilisant par exemple par exemple .Size pour donner une longueur de la liste, [] comme une liste vide, .Appendez d'ajouter un élément à une liste, vous devez obtenir un premier élément de la liste, .tail à Obtenez la liste de "Tous sauf les premiers" éléments de l): p> Ce pseudocode peut être rendu plus concis si vous présumez une syntaxe de liste de liste plus flexible-manipulation. Par exemple, dans Python ("Pseudocode exécutable") à l'aide de la syntaxe "Tranchement" et "Compréhension de la liste": P> def combinations(K, L):
if K > len(L): return []
elif K == len(L): return [L]
else: return [L[:1] + s for s in combinations(K-1, L[1:])
] + combinations(K, L[1:])
code en C # qui produit une liste de combinaisons comme des tableaux de k em> éléments: la syntaxe d'initialisateur de collection utilisé ici est disponible dans VB 2010 ( source ). P> p>
Ma twist, livrant une liste triée, d'abord par la longueur - alors par alpha