Creating all subsets recursively without using array
We get non negative integer number n
from user and we must print all subsets of set ({1,2,3,...,n})
. (n<=20
)
for example for n=3
we must print:
{1 , 2 , 3}
{1 , 2}
{1 , 3}
{1}
{2 , 3}
{2}
{3}
{}
,
s are optional and the sequence can be printed without any comma. (like {1 2 3})
I must add that the sequence of subsets must be exactly like the example. Meaning first the subsets that have 1, then subsets that have 2 and .... The longest subset must be printed first. (lexicographical from the largest subset (the set itself) to null set)
I see a lot of codes in the Internet that solve this problem with arrays or using a bit array that indicate whether we use a number or not. The issue is that in this question, we are not allowed to use -any- type of array or other data structures like vector ,etc. Even using the array behaviour of something like string is completely prohibited. It must be solved only with recursion.
We are also not allowed to use any advanced functions. For example if we write it with C
, we are allowed just to use stdio.h
or for C++
, only <iostream>
is allowed and no other library.
I don't know how to do this without any arrays. How to check which number it must print and at the sametime, manage the {}
.
PS1.
The question is simply generation powerset with these conditions:
USING ARRAY, STRING AND EVEN LOOPS ARE COMPLETELY PROHIBITED. JUST RECURSION.
User Kosyr submitted a very good answer with bit operators. So if you want to submit another answer, submit an answer that even doesn't use bit operators.
PS2.
I write this code by help of George but it doesn't works fine. It doesn't have something like 1 2 4. It also repeats some cases.
#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.
User Kosyr submitted a very good answer with bit operators. So if you want to submit another answer, submit an answer that even doesn't use bit operators.
algorithm recursion subset powerset
add a comment |
We get non negative integer number n
from user and we must print all subsets of set ({1,2,3,...,n})
. (n<=20
)
for example for n=3
we must print:
{1 , 2 , 3}
{1 , 2}
{1 , 3}
{1}
{2 , 3}
{2}
{3}
{}
,
s are optional and the sequence can be printed without any comma. (like {1 2 3})
I must add that the sequence of subsets must be exactly like the example. Meaning first the subsets that have 1, then subsets that have 2 and .... The longest subset must be printed first. (lexicographical from the largest subset (the set itself) to null set)
I see a lot of codes in the Internet that solve this problem with arrays or using a bit array that indicate whether we use a number or not. The issue is that in this question, we are not allowed to use -any- type of array or other data structures like vector ,etc. Even using the array behaviour of something like string is completely prohibited. It must be solved only with recursion.
We are also not allowed to use any advanced functions. For example if we write it with C
, we are allowed just to use stdio.h
or for C++
, only <iostream>
is allowed and no other library.
I don't know how to do this without any arrays. How to check which number it must print and at the sametime, manage the {}
.
PS1.
The question is simply generation powerset with these conditions:
USING ARRAY, STRING AND EVEN LOOPS ARE COMPLETELY PROHIBITED. JUST RECURSION.
User Kosyr submitted a very good answer with bit operators. So if you want to submit another answer, submit an answer that even doesn't use bit operators.
PS2.
I write this code by help of George but it doesn't works fine. It doesn't have something like 1 2 4. It also repeats some cases.
#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.
User Kosyr submitted a very good answer with bit operators. So if you want to submit another answer, submit an answer that even doesn't use bit operators.
algorithm recursion subset powerset
Hint: print all the subsets of length zero, then print all the subsets of length 1, etc. until finally print the only subset of length n.
– thebjorn
Oct 28 at 15:46
@thebjorn I don't know how to do this. I must add that the sequence of subsets must be exactly like the example. Meaning first the subsets that have 1, then subsets that have 2 and .... The longest subset must be printed first. not just length zero. then length 1 and ...
– titansarus
Oct 28 at 15:49
what is maxn
?
– Kozyr
Oct 29 at 6:42
add a comment |
We get non negative integer number n
from user and we must print all subsets of set ({1,2,3,...,n})
. (n<=20
)
for example for n=3
we must print:
{1 , 2 , 3}
{1 , 2}
{1 , 3}
{1}
{2 , 3}
{2}
{3}
{}
,
s are optional and the sequence can be printed without any comma. (like {1 2 3})
I must add that the sequence of subsets must be exactly like the example. Meaning first the subsets that have 1, then subsets that have 2 and .... The longest subset must be printed first. (lexicographical from the largest subset (the set itself) to null set)
I see a lot of codes in the Internet that solve this problem with arrays or using a bit array that indicate whether we use a number or not. The issue is that in this question, we are not allowed to use -any- type of array or other data structures like vector ,etc. Even using the array behaviour of something like string is completely prohibited. It must be solved only with recursion.
We are also not allowed to use any advanced functions. For example if we write it with C
, we are allowed just to use stdio.h
or for C++
, only <iostream>
is allowed and no other library.
I don't know how to do this without any arrays. How to check which number it must print and at the sametime, manage the {}
.
PS1.
The question is simply generation powerset with these conditions:
USING ARRAY, STRING AND EVEN LOOPS ARE COMPLETELY PROHIBITED. JUST RECURSION.
User Kosyr submitted a very good answer with bit operators. So if you want to submit another answer, submit an answer that even doesn't use bit operators.
PS2.
I write this code by help of George but it doesn't works fine. It doesn't have something like 1 2 4. It also repeats some cases.
#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.
User Kosyr submitted a very good answer with bit operators. So if you want to submit another answer, submit an answer that even doesn't use bit operators.
algorithm recursion subset powerset
We get non negative integer number n
from user and we must print all subsets of set ({1,2,3,...,n})
. (n<=20
)
for example for n=3
we must print:
{1 , 2 , 3}
{1 , 2}
{1 , 3}
{1}
{2 , 3}
{2}
{3}
{}
,
s are optional and the sequence can be printed without any comma. (like {1 2 3})
I must add that the sequence of subsets must be exactly like the example. Meaning first the subsets that have 1, then subsets that have 2 and .... The longest subset must be printed first. (lexicographical from the largest subset (the set itself) to null set)
I see a lot of codes in the Internet that solve this problem with arrays or using a bit array that indicate whether we use a number or not. The issue is that in this question, we are not allowed to use -any- type of array or other data structures like vector ,etc. Even using the array behaviour of something like string is completely prohibited. It must be solved only with recursion.
We are also not allowed to use any advanced functions. For example if we write it with C
, we are allowed just to use stdio.h
or for C++
, only <iostream>
is allowed and no other library.
I don't know how to do this without any arrays. How to check which number it must print and at the sametime, manage the {}
.
PS1.
The question is simply generation powerset with these conditions:
USING ARRAY, STRING AND EVEN LOOPS ARE COMPLETELY PROHIBITED. JUST RECURSION.
User Kosyr submitted a very good answer with bit operators. So if you want to submit another answer, submit an answer that even doesn't use bit operators.
PS2.
I write this code by help of George but it doesn't works fine. It doesn't have something like 1 2 4. It also repeats some cases.
#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.
User Kosyr submitted a very good answer with bit operators. So if you want to submit another answer, submit an answer that even doesn't use bit operators.
algorithm recursion subset powerset
algorithm recursion subset powerset
edited Oct 29 at 9:10
asked Oct 28 at 15:41
titansarus
1076
1076
Hint: print all the subsets of length zero, then print all the subsets of length 1, etc. until finally print the only subset of length n.
– thebjorn
Oct 28 at 15:46
@thebjorn I don't know how to do this. I must add that the sequence of subsets must be exactly like the example. Meaning first the subsets that have 1, then subsets that have 2 and .... The longest subset must be printed first. not just length zero. then length 1 and ...
– titansarus
Oct 28 at 15:49
what is maxn
?
– Kozyr
Oct 29 at 6:42
add a comment |
Hint: print all the subsets of length zero, then print all the subsets of length 1, etc. until finally print the only subset of length n.
– thebjorn
Oct 28 at 15:46
@thebjorn I don't know how to do this. I must add that the sequence of subsets must be exactly like the example. Meaning first the subsets that have 1, then subsets that have 2 and .... The longest subset must be printed first. not just length zero. then length 1 and ...
– titansarus
Oct 28 at 15:49
what is maxn
?
– Kozyr
Oct 29 at 6:42
Hint: print all the subsets of length zero, then print all the subsets of length 1, etc. until finally print the only subset of length n.
– thebjorn
Oct 28 at 15:46
Hint: print all the subsets of length zero, then print all the subsets of length 1, etc. until finally print the only subset of length n.
– thebjorn
Oct 28 at 15:46
@thebjorn I don't know how to do this. I must add that the sequence of subsets must be exactly like the example. Meaning first the subsets that have 1, then subsets that have 2 and .... The longest subset must be printed first. not just length zero. then length 1 and ...
– titansarus
Oct 28 at 15:49
@thebjorn I don't know how to do this. I must add that the sequence of subsets must be exactly like the example. Meaning first the subsets that have 1, then subsets that have 2 and .... The longest subset must be printed first. not just length zero. then length 1 and ...
– titansarus
Oct 28 at 15:49
what is max
n
?– Kozyr
Oct 29 at 6:42
what is max
n
?– Kozyr
Oct 29 at 6:42
add a comment |
4 Answers
4
active
oldest
votes
Recursive algorithms are very memory intensive. Here algorithm for n <= 31
#include <iostream>
void bin(unsigned bit, unsigned k, unsigned max_bits) {
if (bit == max_bits) {
std::cout << "{";
bin(bit - 1, k, max_bits);
}
else {
if ((k & (1u << bit)) != 0) {
std::cout << (max_bits - bit) << " ";
}
if (bit != 0) {
bin(bit - 1, k, max_bits);
}
else {
std::cout << "}" << std::endl;
}
}
}
void print(unsigned k, unsigned n, unsigned max_bits) {
bin(max_bits, k, max_bits);
if (k != 0) {
print(k - 1, n, max_bits);
}
}
int main()
{
unsigned n;
std::cin >> n;
print((1u << n) - 1u, 1u<<n, n);
return 0;
}
First recursion print
enumerates k
from 2^n-1
to 0
, second recursion bin
enumerates all bits of k
and print non-zero bits. For example, max_bits = 5
and k = 19
is 10011b = 16 + 2 + 1 = 2^4 + 2^1 + 2^0
, bits 4,1,0
interoperate as set {5-4,5-1,5-0} => {1,4,5}
Thank you very much. But can you edit is somehow that it will print the largest ones first. I mean like my example, lexicographically from the biggest subset (the set itself) to null set? I am new to programming and It is the first time I need to use these bit operators. Also n<=20.
– titansarus
Oct 29 at 8:22
Also another question: Is there any way to solve this without bit operators? (And Also not using loop and array). I mean something like hanoi tower problem? Also I must add that n<=20.
– titansarus
Oct 29 at 8:26
Updated the source for lexicographical ordering. I can't solve it recursively without arrays and bits, butn<=20
hints us to use bits :)
– Kozyr
Oct 29 at 8:43
Thank you again! If there is no answers without bits in two days, I will accept your answer as the best answer. Thank you again.
– titansarus
Oct 29 at 8:47
recursive algorithms can become translated by a sufficiently optimizing compiler or interpreter if they are written as pure functions that recurse only at the end of an execution path using a technique call "tail call optimization".
– George
Nov 2 at 15:36
add a comment |
The alternative to loops is recursion.
To solve this problem (I think...haven't tested it), I investigate the problem by tabulating the sample date and discerned three states, Size
, Start
, and Limit
with progression as follows:
Size Start Limit Output
10 1 10 1..10
10 1 9 1..9
... ...
10 1 1 1
10 2 10 2..10
10 2 9 2..9
... ...
10 2 2 2
... ... ...
10 10 10 10
The following recursive algorithm in pseudo code may do the trick:
printAllSets size
printRows size 1
printRows size start
print "{"
printRow start size
print "}"
print CRLF
if start <= size
printRows size (start + 1)
printRow start limit
if start <= limit
print start + SPACE
printRow start (limit - 1)
Hope this at least helps point you in the right direction.
1
Thank You. your pseudo code had some problems that I edited in my program. but your answer doesn't cover something like 1 2 3 4 5 7 8 9 10. (it doesn't have 6 but has all other numbers). Thank you very much anyway.
– titansarus
Oct 28 at 19:40
1
@titansarus Your question specifically says that it's a set of integers in the range [1,n]. By that formulation, your 1 2 3 4 5 7 8 9 10 dillemma is moot.
– erip
Oct 28 at 20:48
@erip I Said that for n = 10. For example {1 , 2 , 3 ,4 , 5 ,7 , 8 , 9 ,10} is a subset of {1 , 2, ... , 10} but the above algorithm don't generate that. My question is generation of Power Set without loop,array and string... using just pure recursion. I checked a lot of algorithms in the internet but even the most simple of them used at least loop or string. I found nothing that satisfies all of my problem conditions at once.
– titansarus
Oct 28 at 20:52
@titansarus I have added another answer after some thought. It is rather elegant though not tail call optimized (something you can probably contribute). It definespowerset (k+1)
in terms ofpowerset k
.
– George
Nov 12 at 17:51
add a comment |
I think we can solve this iteratively, which we can assume could also be converted to recursion, although it seems unnecessary. Consider that we can unrank any of the combinations given its index, using common knowledge. So all we need to do is count how many earlier combinations we are skipping and how many we need to unrank at each stage of the iteration (I may have missed something in the following but I think the general idea is sound):
Skip 0, unrank from `3 choose 3`
`2 choose 2` combinations
{1 , 2 , 3}
Skip 0, unrank from `3 choose 2`
`2 choose 1` combinations
{1 , 2}
{1 , 3}
Skip 0, unrank from `3 choose 1`
`2 choose 0` combinations
{1}
Skip `3 choose 2 - 2 choose 2`,
unrank from `3 choose 2`
`1 choose 1` combinations
{2 , 3}
Skip `3 choose 1 - 2 choose 1`,
unrank from `3 choose 1`
`1 choose 0` combinations
{2}
Skip `3 choose 1 - 1 choose 1`,
unrank from `3 choose 1`
`0 choose 0` combinations
{3}
Empty set
{}
add a comment |
By definition, the powerset of a set k
, powerset k
, is the set of all possible sets containing elements from that given set including the empty set itself. Clearly, when k
is the empty set powerset
is simply the set containing the empty set, [ ]
. Now, given a power set of k
, powerset k
, the powerset for k
plus an additional element, E
, powerset (K+E)
, would include all possible sets containing elements without E
, powerset k
, plus those same elements except now all containing E
pseudo code...
let powerset k =
match k with
| -> []
| x:xs -> x * powerset xs + powerset xs
or with tail call equivalent performance
let powerset k =
let (*) e ess = map (es -> e::es) ess
reduce (e ess -> (e * ess) ++ ess) [ ] (reverse k)
....(In F#)
let rec powerset k =
match k with
| -> [ ]
| x::xs ->
let withoutE = powerset xs
let withE = List.map (fun es -> x::es) withoutE
List.append withE withoutE
or more succinctly
let rec powerset = function
| -> [ ]
| x::xs -> List.append (List.map (fun es -> x::es) (powerset xs)) (powerset xs)
A better version would allow for tail call optimization...which we achieved using common functional patterns:
let rec powerset2 k =
let inline (++) a b = List.concat [a;b]
let inline (+*) a bs = List.map (fun b -> a::b) bs
List.fold
(fun ac a -> (a +* ac) ++ ac)
[ ]
(List.rev k)
-- this all took me a while to rediscover. It was a fun little puzzle. :)
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53033249%2fcreating-all-subsets-recursively-without-using-array%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
4 Answers
4
active
oldest
votes
4 Answers
4
active
oldest
votes
active
oldest
votes
active
oldest
votes
Recursive algorithms are very memory intensive. Here algorithm for n <= 31
#include <iostream>
void bin(unsigned bit, unsigned k, unsigned max_bits) {
if (bit == max_bits) {
std::cout << "{";
bin(bit - 1, k, max_bits);
}
else {
if ((k & (1u << bit)) != 0) {
std::cout << (max_bits - bit) << " ";
}
if (bit != 0) {
bin(bit - 1, k, max_bits);
}
else {
std::cout << "}" << std::endl;
}
}
}
void print(unsigned k, unsigned n, unsigned max_bits) {
bin(max_bits, k, max_bits);
if (k != 0) {
print(k - 1, n, max_bits);
}
}
int main()
{
unsigned n;
std::cin >> n;
print((1u << n) - 1u, 1u<<n, n);
return 0;
}
First recursion print
enumerates k
from 2^n-1
to 0
, second recursion bin
enumerates all bits of k
and print non-zero bits. For example, max_bits = 5
and k = 19
is 10011b = 16 + 2 + 1 = 2^4 + 2^1 + 2^0
, bits 4,1,0
interoperate as set {5-4,5-1,5-0} => {1,4,5}
Thank you very much. But can you edit is somehow that it will print the largest ones first. I mean like my example, lexicographically from the biggest subset (the set itself) to null set? I am new to programming and It is the first time I need to use these bit operators. Also n<=20.
– titansarus
Oct 29 at 8:22
Also another question: Is there any way to solve this without bit operators? (And Also not using loop and array). I mean something like hanoi tower problem? Also I must add that n<=20.
– titansarus
Oct 29 at 8:26
Updated the source for lexicographical ordering. I can't solve it recursively without arrays and bits, butn<=20
hints us to use bits :)
– Kozyr
Oct 29 at 8:43
Thank you again! If there is no answers without bits in two days, I will accept your answer as the best answer. Thank you again.
– titansarus
Oct 29 at 8:47
recursive algorithms can become translated by a sufficiently optimizing compiler or interpreter if they are written as pure functions that recurse only at the end of an execution path using a technique call "tail call optimization".
– George
Nov 2 at 15:36
add a comment |
Recursive algorithms are very memory intensive. Here algorithm for n <= 31
#include <iostream>
void bin(unsigned bit, unsigned k, unsigned max_bits) {
if (bit == max_bits) {
std::cout << "{";
bin(bit - 1, k, max_bits);
}
else {
if ((k & (1u << bit)) != 0) {
std::cout << (max_bits - bit) << " ";
}
if (bit != 0) {
bin(bit - 1, k, max_bits);
}
else {
std::cout << "}" << std::endl;
}
}
}
void print(unsigned k, unsigned n, unsigned max_bits) {
bin(max_bits, k, max_bits);
if (k != 0) {
print(k - 1, n, max_bits);
}
}
int main()
{
unsigned n;
std::cin >> n;
print((1u << n) - 1u, 1u<<n, n);
return 0;
}
First recursion print
enumerates k
from 2^n-1
to 0
, second recursion bin
enumerates all bits of k
and print non-zero bits. For example, max_bits = 5
and k = 19
is 10011b = 16 + 2 + 1 = 2^4 + 2^1 + 2^0
, bits 4,1,0
interoperate as set {5-4,5-1,5-0} => {1,4,5}
Thank you very much. But can you edit is somehow that it will print the largest ones first. I mean like my example, lexicographically from the biggest subset (the set itself) to null set? I am new to programming and It is the first time I need to use these bit operators. Also n<=20.
– titansarus
Oct 29 at 8:22
Also another question: Is there any way to solve this without bit operators? (And Also not using loop and array). I mean something like hanoi tower problem? Also I must add that n<=20.
– titansarus
Oct 29 at 8:26
Updated the source for lexicographical ordering. I can't solve it recursively without arrays and bits, butn<=20
hints us to use bits :)
– Kozyr
Oct 29 at 8:43
Thank you again! If there is no answers without bits in two days, I will accept your answer as the best answer. Thank you again.
– titansarus
Oct 29 at 8:47
recursive algorithms can become translated by a sufficiently optimizing compiler or interpreter if they are written as pure functions that recurse only at the end of an execution path using a technique call "tail call optimization".
– George
Nov 2 at 15:36
add a comment |
Recursive algorithms are very memory intensive. Here algorithm for n <= 31
#include <iostream>
void bin(unsigned bit, unsigned k, unsigned max_bits) {
if (bit == max_bits) {
std::cout << "{";
bin(bit - 1, k, max_bits);
}
else {
if ((k & (1u << bit)) != 0) {
std::cout << (max_bits - bit) << " ";
}
if (bit != 0) {
bin(bit - 1, k, max_bits);
}
else {
std::cout << "}" << std::endl;
}
}
}
void print(unsigned k, unsigned n, unsigned max_bits) {
bin(max_bits, k, max_bits);
if (k != 0) {
print(k - 1, n, max_bits);
}
}
int main()
{
unsigned n;
std::cin >> n;
print((1u << n) - 1u, 1u<<n, n);
return 0;
}
First recursion print
enumerates k
from 2^n-1
to 0
, second recursion bin
enumerates all bits of k
and print non-zero bits. For example, max_bits = 5
and k = 19
is 10011b = 16 + 2 + 1 = 2^4 + 2^1 + 2^0
, bits 4,1,0
interoperate as set {5-4,5-1,5-0} => {1,4,5}
Recursive algorithms are very memory intensive. Here algorithm for n <= 31
#include <iostream>
void bin(unsigned bit, unsigned k, unsigned max_bits) {
if (bit == max_bits) {
std::cout << "{";
bin(bit - 1, k, max_bits);
}
else {
if ((k & (1u << bit)) != 0) {
std::cout << (max_bits - bit) << " ";
}
if (bit != 0) {
bin(bit - 1, k, max_bits);
}
else {
std::cout << "}" << std::endl;
}
}
}
void print(unsigned k, unsigned n, unsigned max_bits) {
bin(max_bits, k, max_bits);
if (k != 0) {
print(k - 1, n, max_bits);
}
}
int main()
{
unsigned n;
std::cin >> n;
print((1u << n) - 1u, 1u<<n, n);
return 0;
}
First recursion print
enumerates k
from 2^n-1
to 0
, second recursion bin
enumerates all bits of k
and print non-zero bits. For example, max_bits = 5
and k = 19
is 10011b = 16 + 2 + 1 = 2^4 + 2^1 + 2^0
, bits 4,1,0
interoperate as set {5-4,5-1,5-0} => {1,4,5}
edited Oct 29 at 8:50
answered Oct 29 at 7:19
Kozyr
1866
1866
Thank you very much. But can you edit is somehow that it will print the largest ones first. I mean like my example, lexicographically from the biggest subset (the set itself) to null set? I am new to programming and It is the first time I need to use these bit operators. Also n<=20.
– titansarus
Oct 29 at 8:22
Also another question: Is there any way to solve this without bit operators? (And Also not using loop and array). I mean something like hanoi tower problem? Also I must add that n<=20.
– titansarus
Oct 29 at 8:26
Updated the source for lexicographical ordering. I can't solve it recursively without arrays and bits, butn<=20
hints us to use bits :)
– Kozyr
Oct 29 at 8:43
Thank you again! If there is no answers without bits in two days, I will accept your answer as the best answer. Thank you again.
– titansarus
Oct 29 at 8:47
recursive algorithms can become translated by a sufficiently optimizing compiler or interpreter if they are written as pure functions that recurse only at the end of an execution path using a technique call "tail call optimization".
– George
Nov 2 at 15:36
add a comment |
Thank you very much. But can you edit is somehow that it will print the largest ones first. I mean like my example, lexicographically from the biggest subset (the set itself) to null set? I am new to programming and It is the first time I need to use these bit operators. Also n<=20.
– titansarus
Oct 29 at 8:22
Also another question: Is there any way to solve this without bit operators? (And Also not using loop and array). I mean something like hanoi tower problem? Also I must add that n<=20.
– titansarus
Oct 29 at 8:26
Updated the source for lexicographical ordering. I can't solve it recursively without arrays and bits, butn<=20
hints us to use bits :)
– Kozyr
Oct 29 at 8:43
Thank you again! If there is no answers without bits in two days, I will accept your answer as the best answer. Thank you again.
– titansarus
Oct 29 at 8:47
recursive algorithms can become translated by a sufficiently optimizing compiler or interpreter if they are written as pure functions that recurse only at the end of an execution path using a technique call "tail call optimization".
– George
Nov 2 at 15:36
Thank you very much. But can you edit is somehow that it will print the largest ones first. I mean like my example, lexicographically from the biggest subset (the set itself) to null set? I am new to programming and It is the first time I need to use these bit operators. Also n<=20.
– titansarus
Oct 29 at 8:22
Thank you very much. But can you edit is somehow that it will print the largest ones first. I mean like my example, lexicographically from the biggest subset (the set itself) to null set? I am new to programming and It is the first time I need to use these bit operators. Also n<=20.
– titansarus
Oct 29 at 8:22
Also another question: Is there any way to solve this without bit operators? (And Also not using loop and array). I mean something like hanoi tower problem? Also I must add that n<=20.
– titansarus
Oct 29 at 8:26
Also another question: Is there any way to solve this without bit operators? (And Also not using loop and array). I mean something like hanoi tower problem? Also I must add that n<=20.
– titansarus
Oct 29 at 8:26
Updated the source for lexicographical ordering. I can't solve it recursively without arrays and bits, but
n<=20
hints us to use bits :)– Kozyr
Oct 29 at 8:43
Updated the source for lexicographical ordering. I can't solve it recursively without arrays and bits, but
n<=20
hints us to use bits :)– Kozyr
Oct 29 at 8:43
Thank you again! If there is no answers without bits in two days, I will accept your answer as the best answer. Thank you again.
– titansarus
Oct 29 at 8:47
Thank you again! If there is no answers without bits in two days, I will accept your answer as the best answer. Thank you again.
– titansarus
Oct 29 at 8:47
recursive algorithms can become translated by a sufficiently optimizing compiler or interpreter if they are written as pure functions that recurse only at the end of an execution path using a technique call "tail call optimization".
– George
Nov 2 at 15:36
recursive algorithms can become translated by a sufficiently optimizing compiler or interpreter if they are written as pure functions that recurse only at the end of an execution path using a technique call "tail call optimization".
– George
Nov 2 at 15:36
add a comment |
The alternative to loops is recursion.
To solve this problem (I think...haven't tested it), I investigate the problem by tabulating the sample date and discerned three states, Size
, Start
, and Limit
with progression as follows:
Size Start Limit Output
10 1 10 1..10
10 1 9 1..9
... ...
10 1 1 1
10 2 10 2..10
10 2 9 2..9
... ...
10 2 2 2
... ... ...
10 10 10 10
The following recursive algorithm in pseudo code may do the trick:
printAllSets size
printRows size 1
printRows size start
print "{"
printRow start size
print "}"
print CRLF
if start <= size
printRows size (start + 1)
printRow start limit
if start <= limit
print start + SPACE
printRow start (limit - 1)
Hope this at least helps point you in the right direction.
1
Thank You. your pseudo code had some problems that I edited in my program. but your answer doesn't cover something like 1 2 3 4 5 7 8 9 10. (it doesn't have 6 but has all other numbers). Thank you very much anyway.
– titansarus
Oct 28 at 19:40
1
@titansarus Your question specifically says that it's a set of integers in the range [1,n]. By that formulation, your 1 2 3 4 5 7 8 9 10 dillemma is moot.
– erip
Oct 28 at 20:48
@erip I Said that for n = 10. For example {1 , 2 , 3 ,4 , 5 ,7 , 8 , 9 ,10} is a subset of {1 , 2, ... , 10} but the above algorithm don't generate that. My question is generation of Power Set without loop,array and string... using just pure recursion. I checked a lot of algorithms in the internet but even the most simple of them used at least loop or string. I found nothing that satisfies all of my problem conditions at once.
– titansarus
Oct 28 at 20:52
@titansarus I have added another answer after some thought. It is rather elegant though not tail call optimized (something you can probably contribute). It definespowerset (k+1)
in terms ofpowerset k
.
– George
Nov 12 at 17:51
add a comment |
The alternative to loops is recursion.
To solve this problem (I think...haven't tested it), I investigate the problem by tabulating the sample date and discerned three states, Size
, Start
, and Limit
with progression as follows:
Size Start Limit Output
10 1 10 1..10
10 1 9 1..9
... ...
10 1 1 1
10 2 10 2..10
10 2 9 2..9
... ...
10 2 2 2
... ... ...
10 10 10 10
The following recursive algorithm in pseudo code may do the trick:
printAllSets size
printRows size 1
printRows size start
print "{"
printRow start size
print "}"
print CRLF
if start <= size
printRows size (start + 1)
printRow start limit
if start <= limit
print start + SPACE
printRow start (limit - 1)
Hope this at least helps point you in the right direction.
1
Thank You. your pseudo code had some problems that I edited in my program. but your answer doesn't cover something like 1 2 3 4 5 7 8 9 10. (it doesn't have 6 but has all other numbers). Thank you very much anyway.
– titansarus
Oct 28 at 19:40
1
@titansarus Your question specifically says that it's a set of integers in the range [1,n]. By that formulation, your 1 2 3 4 5 7 8 9 10 dillemma is moot.
– erip
Oct 28 at 20:48
@erip I Said that for n = 10. For example {1 , 2 , 3 ,4 , 5 ,7 , 8 , 9 ,10} is a subset of {1 , 2, ... , 10} but the above algorithm don't generate that. My question is generation of Power Set without loop,array and string... using just pure recursion. I checked a lot of algorithms in the internet but even the most simple of them used at least loop or string. I found nothing that satisfies all of my problem conditions at once.
– titansarus
Oct 28 at 20:52
@titansarus I have added another answer after some thought. It is rather elegant though not tail call optimized (something you can probably contribute). It definespowerset (k+1)
in terms ofpowerset k
.
– George
Nov 12 at 17:51
add a comment |
The alternative to loops is recursion.
To solve this problem (I think...haven't tested it), I investigate the problem by tabulating the sample date and discerned three states, Size
, Start
, and Limit
with progression as follows:
Size Start Limit Output
10 1 10 1..10
10 1 9 1..9
... ...
10 1 1 1
10 2 10 2..10
10 2 9 2..9
... ...
10 2 2 2
... ... ...
10 10 10 10
The following recursive algorithm in pseudo code may do the trick:
printAllSets size
printRows size 1
printRows size start
print "{"
printRow start size
print "}"
print CRLF
if start <= size
printRows size (start + 1)
printRow start limit
if start <= limit
print start + SPACE
printRow start (limit - 1)
Hope this at least helps point you in the right direction.
The alternative to loops is recursion.
To solve this problem (I think...haven't tested it), I investigate the problem by tabulating the sample date and discerned three states, Size
, Start
, and Limit
with progression as follows:
Size Start Limit Output
10 1 10 1..10
10 1 9 1..9
... ...
10 1 1 1
10 2 10 2..10
10 2 9 2..9
... ...
10 2 2 2
... ... ...
10 10 10 10
The following recursive algorithm in pseudo code may do the trick:
printAllSets size
printRows size 1
printRows size start
print "{"
printRow start size
print "}"
print CRLF
if start <= size
printRows size (start + 1)
printRow start limit
if start <= limit
print start + SPACE
printRow start (limit - 1)
Hope this at least helps point you in the right direction.
answered Oct 28 at 18:54
George
7281325
7281325
1
Thank You. your pseudo code had some problems that I edited in my program. but your answer doesn't cover something like 1 2 3 4 5 7 8 9 10. (it doesn't have 6 but has all other numbers). Thank you very much anyway.
– titansarus
Oct 28 at 19:40
1
@titansarus Your question specifically says that it's a set of integers in the range [1,n]. By that formulation, your 1 2 3 4 5 7 8 9 10 dillemma is moot.
– erip
Oct 28 at 20:48
@erip I Said that for n = 10. For example {1 , 2 , 3 ,4 , 5 ,7 , 8 , 9 ,10} is a subset of {1 , 2, ... , 10} but the above algorithm don't generate that. My question is generation of Power Set without loop,array and string... using just pure recursion. I checked a lot of algorithms in the internet but even the most simple of them used at least loop or string. I found nothing that satisfies all of my problem conditions at once.
– titansarus
Oct 28 at 20:52
@titansarus I have added another answer after some thought. It is rather elegant though not tail call optimized (something you can probably contribute). It definespowerset (k+1)
in terms ofpowerset k
.
– George
Nov 12 at 17:51
add a comment |
1
Thank You. your pseudo code had some problems that I edited in my program. but your answer doesn't cover something like 1 2 3 4 5 7 8 9 10. (it doesn't have 6 but has all other numbers). Thank you very much anyway.
– titansarus
Oct 28 at 19:40
1
@titansarus Your question specifically says that it's a set of integers in the range [1,n]. By that formulation, your 1 2 3 4 5 7 8 9 10 dillemma is moot.
– erip
Oct 28 at 20:48
@erip I Said that for n = 10. For example {1 , 2 , 3 ,4 , 5 ,7 , 8 , 9 ,10} is a subset of {1 , 2, ... , 10} but the above algorithm don't generate that. My question is generation of Power Set without loop,array and string... using just pure recursion. I checked a lot of algorithms in the internet but even the most simple of them used at least loop or string. I found nothing that satisfies all of my problem conditions at once.
– titansarus
Oct 28 at 20:52
@titansarus I have added another answer after some thought. It is rather elegant though not tail call optimized (something you can probably contribute). It definespowerset (k+1)
in terms ofpowerset k
.
– George
Nov 12 at 17:51
1
1
Thank You. your pseudo code had some problems that I edited in my program. but your answer doesn't cover something like 1 2 3 4 5 7 8 9 10. (it doesn't have 6 but has all other numbers). Thank you very much anyway.
– titansarus
Oct 28 at 19:40
Thank You. your pseudo code had some problems that I edited in my program. but your answer doesn't cover something like 1 2 3 4 5 7 8 9 10. (it doesn't have 6 but has all other numbers). Thank you very much anyway.
– titansarus
Oct 28 at 19:40
1
1
@titansarus Your question specifically says that it's a set of integers in the range [1,n]. By that formulation, your 1 2 3 4 5 7 8 9 10 dillemma is moot.
– erip
Oct 28 at 20:48
@titansarus Your question specifically says that it's a set of integers in the range [1,n]. By that formulation, your 1 2 3 4 5 7 8 9 10 dillemma is moot.
– erip
Oct 28 at 20:48
@erip I Said that for n = 10. For example {1 , 2 , 3 ,4 , 5 ,7 , 8 , 9 ,10} is a subset of {1 , 2, ... , 10} but the above algorithm don't generate that. My question is generation of Power Set without loop,array and string... using just pure recursion. I checked a lot of algorithms in the internet but even the most simple of them used at least loop or string. I found nothing that satisfies all of my problem conditions at once.
– titansarus
Oct 28 at 20:52
@erip I Said that for n = 10. For example {1 , 2 , 3 ,4 , 5 ,7 , 8 , 9 ,10} is a subset of {1 , 2, ... , 10} but the above algorithm don't generate that. My question is generation of Power Set without loop,array and string... using just pure recursion. I checked a lot of algorithms in the internet but even the most simple of them used at least loop or string. I found nothing that satisfies all of my problem conditions at once.
– titansarus
Oct 28 at 20:52
@titansarus I have added another answer after some thought. It is rather elegant though not tail call optimized (something you can probably contribute). It defines
powerset (k+1)
in terms of powerset k
.– George
Nov 12 at 17:51
@titansarus I have added another answer after some thought. It is rather elegant though not tail call optimized (something you can probably contribute). It defines
powerset (k+1)
in terms of powerset k
.– George
Nov 12 at 17:51
add a comment |
I think we can solve this iteratively, which we can assume could also be converted to recursion, although it seems unnecessary. Consider that we can unrank any of the combinations given its index, using common knowledge. So all we need to do is count how many earlier combinations we are skipping and how many we need to unrank at each stage of the iteration (I may have missed something in the following but I think the general idea is sound):
Skip 0, unrank from `3 choose 3`
`2 choose 2` combinations
{1 , 2 , 3}
Skip 0, unrank from `3 choose 2`
`2 choose 1` combinations
{1 , 2}
{1 , 3}
Skip 0, unrank from `3 choose 1`
`2 choose 0` combinations
{1}
Skip `3 choose 2 - 2 choose 2`,
unrank from `3 choose 2`
`1 choose 1` combinations
{2 , 3}
Skip `3 choose 1 - 2 choose 1`,
unrank from `3 choose 1`
`1 choose 0` combinations
{2}
Skip `3 choose 1 - 1 choose 1`,
unrank from `3 choose 1`
`0 choose 0` combinations
{3}
Empty set
{}
add a comment |
I think we can solve this iteratively, which we can assume could also be converted to recursion, although it seems unnecessary. Consider that we can unrank any of the combinations given its index, using common knowledge. So all we need to do is count how many earlier combinations we are skipping and how many we need to unrank at each stage of the iteration (I may have missed something in the following but I think the general idea is sound):
Skip 0, unrank from `3 choose 3`
`2 choose 2` combinations
{1 , 2 , 3}
Skip 0, unrank from `3 choose 2`
`2 choose 1` combinations
{1 , 2}
{1 , 3}
Skip 0, unrank from `3 choose 1`
`2 choose 0` combinations
{1}
Skip `3 choose 2 - 2 choose 2`,
unrank from `3 choose 2`
`1 choose 1` combinations
{2 , 3}
Skip `3 choose 1 - 2 choose 1`,
unrank from `3 choose 1`
`1 choose 0` combinations
{2}
Skip `3 choose 1 - 1 choose 1`,
unrank from `3 choose 1`
`0 choose 0` combinations
{3}
Empty set
{}
add a comment |
I think we can solve this iteratively, which we can assume could also be converted to recursion, although it seems unnecessary. Consider that we can unrank any of the combinations given its index, using common knowledge. So all we need to do is count how many earlier combinations we are skipping and how many we need to unrank at each stage of the iteration (I may have missed something in the following but I think the general idea is sound):
Skip 0, unrank from `3 choose 3`
`2 choose 2` combinations
{1 , 2 , 3}
Skip 0, unrank from `3 choose 2`
`2 choose 1` combinations
{1 , 2}
{1 , 3}
Skip 0, unrank from `3 choose 1`
`2 choose 0` combinations
{1}
Skip `3 choose 2 - 2 choose 2`,
unrank from `3 choose 2`
`1 choose 1` combinations
{2 , 3}
Skip `3 choose 1 - 2 choose 1`,
unrank from `3 choose 1`
`1 choose 0` combinations
{2}
Skip `3 choose 1 - 1 choose 1`,
unrank from `3 choose 1`
`0 choose 0` combinations
{3}
Empty set
{}
I think we can solve this iteratively, which we can assume could also be converted to recursion, although it seems unnecessary. Consider that we can unrank any of the combinations given its index, using common knowledge. So all we need to do is count how many earlier combinations we are skipping and how many we need to unrank at each stage of the iteration (I may have missed something in the following but I think the general idea is sound):
Skip 0, unrank from `3 choose 3`
`2 choose 2` combinations
{1 , 2 , 3}
Skip 0, unrank from `3 choose 2`
`2 choose 1` combinations
{1 , 2}
{1 , 3}
Skip 0, unrank from `3 choose 1`
`2 choose 0` combinations
{1}
Skip `3 choose 2 - 2 choose 2`,
unrank from `3 choose 2`
`1 choose 1` combinations
{2 , 3}
Skip `3 choose 1 - 2 choose 1`,
unrank from `3 choose 1`
`1 choose 0` combinations
{2}
Skip `3 choose 1 - 1 choose 1`,
unrank from `3 choose 1`
`0 choose 0` combinations
{3}
Empty set
{}
answered Oct 30 at 4:18
גלעד ברקן
12.2k21439
12.2k21439
add a comment |
add a comment |
By definition, the powerset of a set k
, powerset k
, is the set of all possible sets containing elements from that given set including the empty set itself. Clearly, when k
is the empty set powerset
is simply the set containing the empty set, [ ]
. Now, given a power set of k
, powerset k
, the powerset for k
plus an additional element, E
, powerset (K+E)
, would include all possible sets containing elements without E
, powerset k
, plus those same elements except now all containing E
pseudo code...
let powerset k =
match k with
| -> []
| x:xs -> x * powerset xs + powerset xs
or with tail call equivalent performance
let powerset k =
let (*) e ess = map (es -> e::es) ess
reduce (e ess -> (e * ess) ++ ess) [ ] (reverse k)
....(In F#)
let rec powerset k =
match k with
| -> [ ]
| x::xs ->
let withoutE = powerset xs
let withE = List.map (fun es -> x::es) withoutE
List.append withE withoutE
or more succinctly
let rec powerset = function
| -> [ ]
| x::xs -> List.append (List.map (fun es -> x::es) (powerset xs)) (powerset xs)
A better version would allow for tail call optimization...which we achieved using common functional patterns:
let rec powerset2 k =
let inline (++) a b = List.concat [a;b]
let inline (+*) a bs = List.map (fun b -> a::b) bs
List.fold
(fun ac a -> (a +* ac) ++ ac)
[ ]
(List.rev k)
-- this all took me a while to rediscover. It was a fun little puzzle. :)
add a comment |
By definition, the powerset of a set k
, powerset k
, is the set of all possible sets containing elements from that given set including the empty set itself. Clearly, when k
is the empty set powerset
is simply the set containing the empty set, [ ]
. Now, given a power set of k
, powerset k
, the powerset for k
plus an additional element, E
, powerset (K+E)
, would include all possible sets containing elements without E
, powerset k
, plus those same elements except now all containing E
pseudo code...
let powerset k =
match k with
| -> []
| x:xs -> x * powerset xs + powerset xs
or with tail call equivalent performance
let powerset k =
let (*) e ess = map (es -> e::es) ess
reduce (e ess -> (e * ess) ++ ess) [ ] (reverse k)
....(In F#)
let rec powerset k =
match k with
| -> [ ]
| x::xs ->
let withoutE = powerset xs
let withE = List.map (fun es -> x::es) withoutE
List.append withE withoutE
or more succinctly
let rec powerset = function
| -> [ ]
| x::xs -> List.append (List.map (fun es -> x::es) (powerset xs)) (powerset xs)
A better version would allow for tail call optimization...which we achieved using common functional patterns:
let rec powerset2 k =
let inline (++) a b = List.concat [a;b]
let inline (+*) a bs = List.map (fun b -> a::b) bs
List.fold
(fun ac a -> (a +* ac) ++ ac)
[ ]
(List.rev k)
-- this all took me a while to rediscover. It was a fun little puzzle. :)
add a comment |
By definition, the powerset of a set k
, powerset k
, is the set of all possible sets containing elements from that given set including the empty set itself. Clearly, when k
is the empty set powerset
is simply the set containing the empty set, [ ]
. Now, given a power set of k
, powerset k
, the powerset for k
plus an additional element, E
, powerset (K+E)
, would include all possible sets containing elements without E
, powerset k
, plus those same elements except now all containing E
pseudo code...
let powerset k =
match k with
| -> []
| x:xs -> x * powerset xs + powerset xs
or with tail call equivalent performance
let powerset k =
let (*) e ess = map (es -> e::es) ess
reduce (e ess -> (e * ess) ++ ess) [ ] (reverse k)
....(In F#)
let rec powerset k =
match k with
| -> [ ]
| x::xs ->
let withoutE = powerset xs
let withE = List.map (fun es -> x::es) withoutE
List.append withE withoutE
or more succinctly
let rec powerset = function
| -> [ ]
| x::xs -> List.append (List.map (fun es -> x::es) (powerset xs)) (powerset xs)
A better version would allow for tail call optimization...which we achieved using common functional patterns:
let rec powerset2 k =
let inline (++) a b = List.concat [a;b]
let inline (+*) a bs = List.map (fun b -> a::b) bs
List.fold
(fun ac a -> (a +* ac) ++ ac)
[ ]
(List.rev k)
-- this all took me a while to rediscover. It was a fun little puzzle. :)
By definition, the powerset of a set k
, powerset k
, is the set of all possible sets containing elements from that given set including the empty set itself. Clearly, when k
is the empty set powerset
is simply the set containing the empty set, [ ]
. Now, given a power set of k
, powerset k
, the powerset for k
plus an additional element, E
, powerset (K+E)
, would include all possible sets containing elements without E
, powerset k
, plus those same elements except now all containing E
pseudo code...
let powerset k =
match k with
| -> []
| x:xs -> x * powerset xs + powerset xs
or with tail call equivalent performance
let powerset k =
let (*) e ess = map (es -> e::es) ess
reduce (e ess -> (e * ess) ++ ess) [ ] (reverse k)
....(In F#)
let rec powerset k =
match k with
| -> [ ]
| x::xs ->
let withoutE = powerset xs
let withE = List.map (fun es -> x::es) withoutE
List.append withE withoutE
or more succinctly
let rec powerset = function
| -> [ ]
| x::xs -> List.append (List.map (fun es -> x::es) (powerset xs)) (powerset xs)
A better version would allow for tail call optimization...which we achieved using common functional patterns:
let rec powerset2 k =
let inline (++) a b = List.concat [a;b]
let inline (+*) a bs = List.map (fun b -> a::b) bs
List.fold
(fun ac a -> (a +* ac) ++ ac)
[ ]
(List.rev k)
-- this all took me a while to rediscover. It was a fun little puzzle. :)
edited Nov 19 at 23:12
answered Nov 12 at 14:56
George
7281325
7281325
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53033249%2fcreating-all-subsets-recursively-without-using-array%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Hint: print all the subsets of length zero, then print all the subsets of length 1, etc. until finally print the only subset of length n.
– thebjorn
Oct 28 at 15:46
@thebjorn I don't know how to do this. I must add that the sequence of subsets must be exactly like the example. Meaning first the subsets that have 1, then subsets that have 2 and .... The longest subset must be printed first. not just length zero. then length 1 and ...
– titansarus
Oct 28 at 15:49
what is max
n
?– Kozyr
Oct 29 at 6:42