Power set: Difference between revisions

→‎{{header|C}}: rewrite to remove size limit
(→‎{{header|Perl 6}}: simplify, supply alternative impl)
(→‎{{header|C}}: rewrite to remove size limit)
Line 224:
 
=={{header|C}}==
<lang c>#include <limitsstdio.h>
#include <stdio.h>
#include <stdlib.h>
 
struct node {
static void powerset(int argc, char** argv)
char *s;
struct node* prev;
unsigned int i, j, bits, i_max = 1U << argc;
};
 
void powerset(char **v, int n, struct node *up)
if (argc >= sizeof(i) * CHAR_BIT) {
fprintf(stderr, "Error: set too large\n");
struct node me;
exit(1);
}
 
if (!n) {
for (i = 0; i < i_max ; ++i) {
putchar('[');
printf("{");
while (up) {
for (bits = i, j = 0; bits; bits >>= 1, ++j) {
printf(" %s", up->s);
if (bits & 1)
up = up->prev;
printf(bits > 1 ? "%s, " : "%s", argv[j]);
}
}
printf puts("}\n ]");
} else {
}
me.s = *v;
me.prev = up;
powerset(v + 1, n - 1, up);
powerset(v + 1, n - 1, &me);
}
}
 
int main(int argc, char* **argv[])
{
powerset(argv + 1, powerset(argc - 1, argv + 10);
return 0;
}</lang>output<lang>% ./a.out 1 2 3 4
{{out}}
<pre>
{1}
% ./a.out 1 2 3
{2}
[ ]
{1, 2}
[ 3 ]
{3}
[ 2 ]
{1, 3}
{2,[ 3} 2 ]
{1,[ 2,1 3}]
[ 3 1 ]
{4}
{[ 2 1, 4}]
[ 3 2 1 }]
{2, 4}
</pre>
{1, 2, 4}
{3, 4}
{1, 3, 4}
{2, 3, 4}
{1, 2, 3, 4}</lang>
 
=={{header|C++}}==
Anonymous user