Мы получаем неотрицательное целое число n
от пользователя, и мы должны напечатать все подмножества набора ({1,2,3,...,n})
.(n<=20
)
, например, для n=3
мы должны напечатать:
{1 , 2 , 3}
{1 , 2}
{1 , 3}
{1}
{2 , 3}
{2}
{3}
{}
,
s необязательно, и последовательность может быть напечатана без запятой.(как {1 2 3}) Я должен добавить, что последовательность подмножеств должна быть точно такой же, как в примере.Имеется в виду сначала подмножества, которые имеют 1, затем подмножества, которые имеют 2 и .... Самое длинное подмножество должно быть напечатано первым.(лексикографический от самого большого подмножества (самого набора) к нулевому набору)
Я вижу много кодов в Интернете, которые решают эту проблему с массивами или используют битовый массив, который указывает, используем ли мы число или нет,Проблема заключается в том, что в этом вопросе нам не разрешено использовать массив любого типа или другие структуры данных, такие как вектор и т. Д.Даже использование поведения массива чего-то вроде строки полностью запрещеноЭто должно быть решено только с помощью рекурсии.
Нам также не разрешено использовать какие-либо расширенные функции.Например, если мы напишем его с помощью C
, нам разрешено просто использовать stdio.h
или для C++
, разрешено только <iostream>
и никакой другой библиотеки.
Я не знаю, каксделать это без каких-либо массивов.Как проверить, какой номер он должен распечатать и в то же время управлять {}
.
PS1.Вопрос заключается в простом поколении powerset с этими условиями:
ИСПОЛЬЗОВАНИЕ Массива, STRING и ДАЖЕ ЦИКЛОВ ПОЛНОСТЬЮ ЗАПРЕЩЕНЫ.ПРОСТО РЕКУРСИЯ.
Пользователь Косыр представил очень хороший ответ с битовыми операторами.Поэтому, если вы хотите отправить другой ответ, отправьте ответ, который даже не использует битовые операторы.
PS2.
Я пишу этот код с помощью Джорджа, но он не работает нормально,Он не имеет ничего похожего на 1 2 4. Он также повторяет некоторые случаи.
#include <stdio.h>
void printAllSets (int size)
{printRows (size, 1);}
void printRows (int size , int start)
{
if (start<=size)
{printf( "{ ");
printRow (start, size);
printf ("}");
printf ("\n");}
if (start <= size)
{printRows(size -1 , start);
printRows (size , (start + 1));}
}
printRow (int start, int limit)
{
if (start <= limit)
{
printf ("%d ",start);
printRow (start +1, limit);
}
}
int main()
{
printAllSets(5);
printf("{ }");
return 0;
}
PS3.
Пользователь Kosyr представил очень хороший ответ с битовыми операторами.Поэтому, если вы хотите отправить другой ответ, отправьте ответ, в котором даже не используются битовые операторы.