English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Дано положительное целое число n,我们必须 напечатать все подмножества множества {1,2,3,4, ... n}, не используя ни одного массива или цикла
Как мы говорим любому числу 3 s,我们必须 напечатать все подмножества множества {1,2,3}, которые будут {1 2 3}, {1 2}, {2 3}, {1 3}, {1}, {2}, {3} {}
Но我们必须 выполнять эту операцию, не используя ни одного цикла или массива. Таким образом, единственным возможным способом решения такой задачи без использования ни одного массива или цикла является рекурсия
Ввод: 3 Вывод: { 1 2 3 } { 1 2 } { 1 3 } { 1 } { 2 3 } { 2 } { 3 } { } Объяснение: Множество будет {1 2 3}, из которого мы найдем подмножества Ввод: 4 Вывод: { 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 } { }
Метод, который мы будем использовать для решения данной задачи-
Начать с num = 2 ^ n - 1 и до 0
Рассмотрим двоичное представление числа num с n разрядами
Начать с самого левого разряда, представляющего 1, вторым разрядом представляется 2 и так далее, до разряда, представляющего n
Вывести цифру, соответствующую данному разряду (если она установлена)
Выполнить вышеуказанные шаги для всех значений num, пока они не станут равны 0
Давайте используем простой пример, чтобы详细了解, как работает метод
Предположим, что вводится n = 3, тогда проблема начинается с num = 2 ^ 3 - 1 = 7
Двоичный вид числа 7⇒
1 | 1 | 1 |
Соответствующее подмножество⇒
1 | 2 | 3 |
Убавить из num 1; num = 6
Двоичный вид числа 6⇒
1 | 1 | 0 |
Соответствующее подмножество⇒
1 | 2 |
|
Убавьте 1 из num; num = 5
Двоичная форма 5⇒
1 | 0 | 1 |
Соответствующее подмножество⇒
1 | 3 |
Убавьте 1 из num; num = 4
Двоичная форма 4⇒
1 | 0 | 0 |
Соответствующее подмножество⇒
1 |
Таким образом, мы будем итерироваться до num = 0 и выводить все подмножества.
Начало Шаг 1 → В функции int subset(int bitn, int num, int num_of_bits) Если bitn >= 0 Если (num & (1 << bitn)) != 0 Вывод num_of_bits - bitn subset(bitn - 1, num, num_of_bits); ELSE Возврат 0 Возврат 1 Шаг 2 → В функции int printSubSets(int num_of_bits, int num) Если (num >= 0) Вывод "{ " Вызов функции subset(num_of_bits - 1, num, num_of_bits) Вывод "}" Вызов функции printSubSets(num_of_bits, num - 1) ELSE Возврат 0 Возврат 1 Шаг 3 → В функции int main() DECLARE И ИНИЦИАЛИЗИРУЙТЕ int n = 4 Вызов функции printSubSets(n, (int) (pow(2, n)) - 1) Остановите
#include <stdio.h> #include <math.h> // This function recursively prints the // subset corresponding to the binary // representation of 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); } //Проверка следующего бита subset(bitn - 1, num, num_of_bits); } else return 0; return 1; } //Функция для вывода подмножеств int printSubSets(int num_of_bits, int num) { if (num >= 0) { printf("{ "); //Вывод подмножеств, соответствующих //Бинарное представление num. subset(bitn - 1, num, num_of_bits); printf("}"); //Рекурсивный вызов функции для //Вывод следующего подмножества. printSubSets(num_of_bits, num - 1); } else return 0; return 1; } //Основной программный код int main() { int n = 4; printSubSets(n, (int) (pow(2, n)) - 1); }
Результат вывода
{ 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 }{ }