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

Imprimir {1,2,3Todos os subconjuntos de …n} sem usar array ou loop no programa C

Dado um número inteiro positivo n,devemos imprimir um conjunto {1,2,3,4,... n} todos os subconjuntos.

da mesma forma que dizemos qualquer número3 assim como我们必须打印集合{1,2,3tudo os subconjuntos dentro de {1 2 3}1 2}2 3}1 3}1}2}3}

Mas我们必须在没有任何循环或数组的情况下执行此操作。因此,apenas a recursão é a possível solução para esse problema, sem usar nenhum array ou loop.

Exemplo

Entrada: 3
Saída: { 1 2 3 {} 1 2 {} 1 3 {} 1 {} 2 3 {} 2 {} 3 {} }
Explicação: O conjunto será {1 2 3a partir do qual encontraremos os subconjuntos
Entrada: 4
Saída: { 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 {} }

Será usado para resolver o problema dado-

  • A partir de num = 2 ^ n -1Começando com 0.

  • Considere a representação binária de num com n dígitos.

  • A partir do representante1A partir do bit mais significativo, o segundo representa2Até representar o bit n do n.

  • Imprima o número correspondente ao bit (se estiver configurado).

  • Execute os mesmos passos para todos os valores de num até que seja igual a 0.

Vamos usar um exemplo simples para entender melhor como o método funciona-

Suponha que a entrada n = 3Então o problema passa a ser num = 2 ^ 3-1 = 7Iniciar 

  • 7⇒representação binária

1um1um1um
  • Subconjunto correspondente ⇒

1um23

Subtraia de num1;num = 6

  • 6representação binária ⇒

1um1um0
  • Subconjunto correspondente ⇒

1um2

Subtraia de num1;num = 5

  • 5representação binária ⇒

1um01um
  • Subconjunto correspondente ⇒

1um
3

Subtraia de num1;num = 4

  • representação binária4⇒

1um00
  • Subconjunto correspondente ⇒

1

Da mesma forma, iteraremos até num = 0 e impressaremos todos os subconjuntos.

Algoritmo

Iniciar
   Passo 1 → Dentro da função int subset(int bitn, int num, int num_of_bits)
   Se bitn >= 0
      Se (num & (1 << bitn)) != 0
         Imprima num_of_bits - bitn
         subset(bitn - 1, num, num_of_bits);
      Caso contrário
         Retornar 0
      Retornar 1
   Passo 2 → Dentro da função int printSubSets(int num_of_bits, int num)
      Se (num >= 0)
         Imprima "{ "
         Chame a função subset(num_of_bits - 1, num, num_of_bits)
         Imprima "}"
         Chame a função printSubSets(num_of_bits, num - 1)
      Caso contrário
         Retornar 0
      Retornar 1
   Passo 3 → Dentro da função int main()
      Declare e inicialize int n = 4
      Chame a função printSubSets(n, (int) (pow(2, n)) -1)
Parar

Exemplo

#include <stdio.h>
#include <math.h>
// Esta função imprime recursivamente a
// subconjunto correspondente ao binário
// representação de 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;
}
//programa principal
int main() {
   int n = 4;
   printSubSets(n, (int) (pow(2, n)) -1);
}

Resultado de Saída

{ 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 {} }