La génération de puissance définie de manière récursive, sans boucles
Comment pouvez-vous écrire une méthode récursive PowerSet(entrée de Chaîne) qui affiche toutes les combinaisons possibles d'une chaîne de caractères qui lui est passé?
Par exemple: PowerSet("abc") permet d'imprimer abc, ab, ac, bc, a, b, c
J'ai vu certains récursive des solutions avec des boucles, mais dans ce cas, pas de boucles sont autorisés.
Des idées?
Edit: La méthode n'a qu'un seul paramètre, c'est à dire d'entrée de Chaîne.
- ce cas? auquel cas?
- Je pense qu'il y a algorithmes qui peuvent résoudre ce problème, dans le cas où vous souhaitez utiliser google pour en trouver un.
- Et presque chaque boucle peut être remplacé par une fonction récursive.
- R. J. je veux dire, dans ce contexte, pas de boucles sont autorisés. C'est l'exigence de la question. @Matten j'ai trouvé quelques unes mais la plupart ne sont pas un bon ajustement, car ils ont obtenu plus de 1 paramètre.
- Vous avez plus qu'un seul paramètre:
String.getBytes();
- Mmm ... intéressant. Mais je pense qu'il serait difficile de code de la solution car je ne suis pas familier avec son fonctionnement.
Vous devez vous connecter pour publier un commentaire.
L'ensemble des parties de
abcd
est l'union de la puissance-ensembles deabc
,abd
,acd
(plusabcd
lui-même*).* à Noter que la ensemble vide, qui est un membre de P(abcd) est également un membre de P(abc), P(abd), ... de sorte que l'équivalence est indiqué ci-dessus tient.
De manière récursive, P(
abc
) = {abc
} + P(ab
) + P(ac
), et ainsi de suiteUne première approche, en pseudo-code, pourrait être:
La récursivité se termine lorsque la chaîne est vide (car il ne pénètre jamais dans la boucle).
Si votre voulez vraiment pas boucles, vous devez la convertir en boucle à l'autre de la récursivité.
Maintenant, nous voulons générer
ab
,ac
etcb
deabc
Une autre approche mettre en œuvre une fonction récursive
P
qui supprime le premier caractère de son argument, ou ne l'est pas. (Ici+
moyens mis de l'union,.
moyens de concaténation etλ
est la chaîne vide)Puis
Si les boucles ont été autorisées,
P
est de puissance-fonction set. Sinon, nous aurions besoin d'un paramètre loopless fonction de la concaténation d'un personnage donné à un ensemble de chaînes de caractères (qui sont de toute évidence deux choses).Certains tweak pourrait être possible en jouant avec
String.replace
(si unString
résultat est souhaitée, ou par le remplacement deSet
avecList
(de sorte que les "autres" paramètre est en fait le premier élément dans la liste).s.substring(0,pos)
sera le retour de la sous-chaîne à partir0
àpos-1
, ets.substring(pos)
sera le retour de la sous-chaîne à partirpos
à la fin de la chaîne.abc
lui-même )" – ne devrait-elle pas êtreabcd
et un sous-ensemble vide à la place?Cela permettra également de faire le tour:
Eh bien, si vous n'avez pas de boucles, d'émuler un avec la récursivité, à l'aide des itérateurs c'est acutally assez simple.
Une version récursive de la solution générique proposé par João Silva :
J'ai extrait le récursive addSets méthode pour transformer l'original
for
boucle:Solution Simple mais avec une mauvaise fois de la complexité(2^n) est de la forme suivante(il suffit de garder une chose à l'esprit une fois que nous avons à éviter(c'est à dire 0) et une fois que nous avons à prendre(c'est à dire 1):
Juste pour le fun, une version qui ne powersets de toute valeur stockée dans un
LinkedList
(pour le rendre facile pour supprimer l'élément de tête). Java 8 ruisseaux faire la partie fonctionnelle:C'est inspiré par ce qui suit Common Lisp, ce qui montre que la langue peut rendre les choses plus simples:
powerSet = filterM (\_ -> [True, False])
Basée sur les informations de ici, voici la solution en C#.
REMARQUE: la boucle dans la fonction principale est juste pour imprimer le résultat dans la console de valeur. Pas de boucles utilisées dans l'ensemble des parties de la méthode.