Power set: Difference between revisions
Content added Content deleted
(→{{header|Perl 6}}: simplify, supply alternative impl) |
(→{{header|C}}: rewrite to remove size limit) |
||
Line 224: | Line 224: | ||
=={{header|C}}== |
=={{header|C}}== |
||
<lang c>#include < |
<lang c>#include <stdio.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]); |
|||
} |
|||
} |
|||
puts(" ]"); |
|||
} else { |
|||
} |
|||
me.s = *v; |
|||
me.prev = up; |
|||
powerset(v + 1, n - 1, up); |
|||
powerset(v + 1, n - 1, &me); |
|||
} |
|||
} |
} |
||
int main(int argc, char |
int main(int argc, char **argv) |
||
{ |
{ |
||
powerset(argv + 1, argc - 1, 0); |
|||
return 0; |
|||
}</lang> |
}</lang> |
||
{} |
{{out}} |
||
<pre> |
|||
{1} |
|||
% ./a.out 1 2 3 |
|||
{2} |
|||
[ ] |
|||
{1, 2} |
|||
[ 3 ] |
|||
{3} |
|||
[ 2 ] |
|||
{1, 3} |
|||
[ 3 2 ] |
|||
[ 1 ] |
|||
[ 3 1 ] |
|||
{4} |
|||
[ 2 1 ] |
|||
⚫ | |||
{2, 4} |
|||
</pre> |
|||
{1, 2, 4} |
|||
{3, 4} |
|||
{1, 3, 4} |
|||
{2, 3, 4} |
|||
{1, 2, 3, 4}</lang> |
|||
=={{header|C++}}== |
=={{header|C++}}== |