English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Печать всех подмножеств {1,2,3,...n} без использования массивов или циклов в C-программе

Дано положительное целое число 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⇒

111
  • Соответствующее подмножество⇒

123

Убавить из num 1; num = 6

  • Двоичный вид числа 6⇒

110
  • Соответствующее подмножество⇒

12

Убавьте 1 из num; num = 5

  • Двоичная форма 5⇒

101
  • Соответствующее подмножество⇒

1
3

Убавьте 1 из num; num = 4

  • Двоичная форма 4⇒

100
  • Соответствующее подмножество⇒

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 }{ }
Основной учебник
Рекомендуется для вас