在C程序中不使用数组或循环打印{1,2,3,…n}的所有子集


给定一个正整数n,我们必须打印集合{1, 2, 3, 4,… n}的所有子集,而不使用任何数组或循环。

例如,如果给定一个数字3,我们必须打印集合{1, 2, 3}的所有子集,它们将是{1 2 3}、{1 2}、{2 3}、{1 3}、{1}、{2}、{3} {}。

但是,我们必须在不使用任何循环或数组的情况下执行此操作。因此,仅递归是解决此类问题而不使用任何数组或循环的可能方法。

示例

Input: 3
Output: { 1 2 3 }{ 1 2 }{ 1 3 }{ 1 }{ 2 3 }{ 2 }{ 3 }{ }
Explanation: The set will be {1 2 3} from which we will find the subsets
Input: 4
Output: { 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位表示n。
  • 如果位被设置,则打印对应于该位的数字。
  • 对num的所有值执行上述步骤,直到它等于0。

让我们使用一个简单的示例详细了解所述方法是如何工作的 −

假设输入n = 3,因此问题从num = 2^3 - 1 = 7开始

  • 7的二进制表示 ⇒
111
  • 相应的子集 ⇒
123

从num中减去1;num = 6

  • 6的二进制表示 ⇒
110
  • 相应的子集 ⇒
12

从num中减去1;num = 5

  • 5的二进制表示 ⇒
101
  • 相应的子集 ⇒
1
3

从num中减去1;num = 4

  • 4的二进制表示 ⇒
100
  • 相应的子集 ⇒
1

类似地,我们将迭代直到num = 0并打印所有子集。

算法

Start
   Step 1 → In function int subset(int bitn, int num, int num_of_bits)
   If bitn >= 0
      If (num & (1 << bitn)) != 0
         Print num_of_bits - bitn
         subset(bitn - 1, num, num_of_bits);
      Else
         Return 0
      Return 1
   Step 2 → In function int printSubSets(int num_of_bits, int num)
      If (num >= 0)
         Print "{ "
         Call function subset(num_of_bits - 1, num, num_of_bits)
         Print "}"
         Call function printSubSets(num_of_bits, num - 1)
      Else
         Return 0
      Return 1
   Step 3 → In function int main()
      Declare and initialize int n = 4
      Call fucntionprintSubSets(n, (int) (pow(2, n)) -1)
Stop

示例

#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);
      }
      // 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;
}
//main program
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 }{ }

更新于: 2019年11月20日

918 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.