2017-10-07 5 views
0

J'ai une méthode qui retourne toutes les combinaisons possibles de 3 éléments dans une chaîne donnée.envelopper trois boucles imbriquées dans la récursivité

void FindAllCombinationsBy3(string &str, int start) 
{ 
    for (int i = 0; i < str.length() - 2; i++) 
    { 
     for (int j = i + 1; j < str.length() - 1; j++) 
     { 
      for (int k = j + 1; k < str.length(); k++) 
      { 
      cout << str[i] << str[j] << str[k] << endl; 
      } 
     } 
    } 

    return; 
} 

Il fonctionne très bien et sorties ceci: abc abd abe ABF ace DAA acf ade. Mais je veux écrire une version récursive de la méthode qui recevra un paramètre n de longueur des combinaisons. Donc non seulement 3, mais une longueur personnalisée. Cela devrait probablement ressembler à ceci. Mais je me suis juste perdu avec ces conditions de récurrence. Je sais que cela a été demandé un million de fois, mais l'autre solution n'a pas encore aidé.

Répondre

1
void print_combinations(const std::string& s, unsigned n, unsigned j = 0, const std::string& a = "") { 
    if (n == 0) { 
    std::cout << a << std::endl; 
    } else { 
    for (auto i = j; i < s.length() - (n - 1); ++i) { 
     print_combinations(s, n - 1, i + 1, a + s[i]); 
    } 
    } 
} 

Utilisation:

print_combinations("abcde", 3); 

Sortie:

abc 
abd 
abe 
acd 
ace 
ade 
bcd 
bce 
bde 
cde 
+0

j'étais proche à un moment donné, mais accumuler didn'T caractères que vous avez fait. ça m'a aidé – earthQuake