2017-10-07 1 views
0

Ich habe eine Methode, die alle möglichen Kombinationen von 3 Elementen in einer gegebenen Zeichenfolge zurückgibt.wrap drei verschachtelte für Schleifen in Rekursion

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; 
} 

Es funktioniert gut und gibt dieses: abc abd abe abf acd ace ACF ade. Aber ich möchte eine rekursive Version der Methode schreiben, die einen Parameter n der Kombinationslänge erhält. Also nicht nur 3, sondern eine benutzerdefinierte Länge. Es sollte wahrscheinlich so aussehen. Aber ich habe mich gerade mit diesen Rekursionsbedingungen verlaufen.

Ich weiß, dass dies eine Million Mal gefragt wurde, aber andere Lösung half noch nicht.

Antwort

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]); 
    } 
    } 
} 

Verbrauch:

print_combinations("abcde", 3); 

Ausgang:

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

i an einem Punkt nahe war, aber didn 't akkumulieren Zeichen wie Sie. es half – earthQuake