English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
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
1um | 1um | 1um |
Subconjunto correspondente ⇒
1um | 2 | 3 |
Subtraia de num1;num = 6
6representação binária ⇒
1um | 1um | 0 |
Subconjunto correspondente ⇒
1um | 2 |
|
Subtraia de num1;num = 5
5representação binária ⇒
1um | 0 | 1um |
Subconjunto correspondente ⇒
1um | 3 |
Subtraia de num1;num = 4
representação binária4⇒
1um | 0 | 0 |
Subconjunto correspondente ⇒
1 |
Da mesma forma, iteraremos até num = 0 e impressaremos todos os subconjuntos.
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
#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 {} }