English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Gegeben eine positive Ganzzahl n, müssen wir eine Menge {1,2,3,4,... n} alle Untermengen.
wie wir jedem Zahl sagen3 wie wir die Menge {1,2,3} enthält alle Untermengen, die sein werden {1 2 3},{1 2},{2 3},{1 3}, {1},{2},{3} {}。
Aber wir müssen diese Operation ohne die Verwendung von任何一个循环或数组执行。Daher ist nur Rekursion die mögliche Methode, um dieses Problem zu lösen, ohne die Verwendung von irgendeiner Art von Array oder Schleife.
Eingabe: } 3 Ausgabe: { 1 2 3 {} 1 2 {} 1 3 {} 1 {} 2 3 {} 2 {} 3 {} } Erklärung: Die Menge wird sein {1 2 3aus dem wir die Teilmenge finden werden Eingabe: } 4 Ausgabe: { 1 2 3 4 {} 1 2 3 {} 1 2 4 {} 1 2 {} 1 3 4 {} 1 3 {} 1 4 {} 1 {} 2 3 4 {} 2 3 {} 2 4 {} 2 {} 3 4 {} 3 {} 4 {} }
Das Verfahren, das wir verwenden werden, um das gegebene Problem zu lösen-
Von num = 2 ^ n -1Beginnend mit 0.
Betrachten Sie die binäre Darstellung von num mit n Stellen.
Von der Repräsentation1Beginnend mit dem linken Mostsignifikanten Bit, repräsentiert das zweite Bit2Bis zur Stelle n.
Drucken Sie die Zahl, die dem Bit entspricht (wenn es gesetzt ist).
Führen Sie die obigen Schritte für alle Werte von num durch, bis 0 erreicht wird.
Lassen Sie uns mit einem einfachen Beispiel die Funktionsweise des Verfahrens genau verstehen-
Angenommen, die Eingabe n = 3Dann wird das Problem von num = 2 ^ 3-1 = 7Beginn
7⇒ in der binären Darstellung
1ein | 1ein | 1ein |
Zusammenhang zur Untermenge⇒
1ein | 2 | 3 |
Von num abziehen1;num = 6
6in der binären Darstellung⇒
1ein | 1ein | 0 |
Zusammenhang zur Untermenge⇒
1ein | 2 |
|
Von num abziehen1;num = 5
5in der binären Darstellung⇒
1ein | 0 | 1ein |
Zusammenhang zur Untermenge⇒
1ein | 3 |
Von num abziehen1;num = 4
binäre Darstellung4⇒
1ein | 0 | 0 |
Zusammenhang zur Untermenge⇒
1 |
Gleichzeitig werden wir iterieren, bis num = 0 und alle Untermengen ausgeben.
Start Schritt 1 → In der Funktion int subset(int bitn, int num, int num_of_bits) Wenn bitn >= 0 Wenn (num & (1 << bitn)) != 0 Drucken Sie num_of_bits - bitn subset(bitn - 1, num, num_of_bits); Sonst Rückgabe 0 Rückgabe 1 Schritt 2 → In der Funktion int printSubSets(int num_of_bits, int num) Wenn (num >= 0) Drucken Sie "{ " Rufen Sie die Funktion subset(num_of_bits - 1, num, num_of_bits) Drucken Sie "}" Rufen Sie die Funktion printSubSets(num_of_bits, num - 1) Sonst Rückgabe 0 Rückgabe 1 Schritt 3 → In der Funktion int main() Erklärung und Initialisierung von int n = 4 Rufen Sie die Funktion printSubSets(n, (int) (pow(2, n)) -1) Stop
#include <stdio.h> #include <math.h> // Diese Funktion gibt rekursiv aus // Zusammenhang zur binären // Darstellung von num. int subset(int bitn, int num, int num_of_bits) { if (bitn >= 0) { // Print number in given subset only // if the bit corresponding to it // is set in num. if ((num & (1 << bitn)) != 0) { printf("%d ", num_of_bits - bitn); } // Check the next bit subset(bitn - 1, num, num_of_bits); } else return 0; return 1; } //function to print the subsets int printSubSets(int num_of_bits, int num) { if (num >= 0) { printf("{ "); // Printint the subsets corresponding to // the binary representation of num. subset(num_of_bits - 1, num, num_of_bits); printf("}"); // recursively calling the function to // print the next subset. printSubSets(num_of_bits, num - 1); } else return 0; return 1; } //Hauptprogramm int main() { int n = 4; printSubSets(n, (int) (pow(2, n)) -1); }
Ausgaberesultat
{ 1 2 3 4 {} 1 2 3 {} 1 2 4 {} 1 2 {} 1 3 4 {} 1 3 {} 1 4 {} 1 {} 2 3 4 {} 2 3 {} 2 4 {} 2 {} 3 4 {} 3 {} 4 {} }