use strict;
use warnings;
my @list = (0, 2, 3);
for my $w (1, 2, 3, 4, 7, 8) {
print "count = $w\n";
make_sets2($w, "", @list);
}
sub make_sets2 {
my $weight = shift;
my $temp_result = shift;
print "$temp_result\n" and return if $weight <= 0;
while (@_) {
my $item = shift;
make_sets2( $weight -1, "$temp_result$item, ", ($item, @_));
}
}
####
$ time perl multisets.pl
count = 1
0,
2,
3,
count = 2
0, 0,
0, 2,
0, 3,
2, 2,
2, 3,
3, 3,
count = 3
0, 0, 0,
0, 0, 2,
0, 0, 3,
0, 2, 2,
0, 2, 3,
0, 3, 3,
2, 2, 2,
2, 2, 3,
2, 3, 3,
3, 3, 3,
count = 4
0, 0, 0, 0,
0, 0, 0, 2,
0, 0, 0, 3,
0, 0, 2, 2,
0, 0, 2, 3,
0, 0, 3, 3,
0, 2, 2, 2,
0, 2, 2, 3,
0, 2, 3, 3,
0, 3, 3, 3,
2, 2, 2, 2,
2, 2, 2, 3,
2, 2, 3, 3,
2, 3, 3, 3,
3, 3, 3, 3,
count = 7
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 2,
0, 0, 0, 0, 0, 0, 3,
0, 0, 0, 0, 0, 2, 2,
. . . (abbreviated)
2, 2, 2, 3, 3, 3, 3, 3,
2, 2, 3, 3, 3, 3, 3, 3,
2, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3,
real 0m0.048s
user 0m0.015s
sys 0m0.000s
##
##
$ time perl multisets.pl > /dev/null
real 0m0.043s
user 0m0.000s
sys 0m0.031s