sub p{my($n,@e,$o)=@_;print if!$_{$_=join$",sort@_,$/}++;p(++$o,--$n,@e)while$n-1}p(shift)
####
sub p{my($n,@e,$o)=@_;$_{$_=join$",sort@_,$/}++||print;p(++$o,$n,@e)while--$n}p pop
##
##
sub p{my(@e,$o)=@_;$_{$_=join$",sort@_,$/}++||print;p(++$o,@e)while--$e[0]}p pop
##
##
sub p{
my($n,@e,$o) = @_;
print if ! $_{$_ = join$",sort@_,$/}++;
p(++$o, --$n, @e) while $n-1;
}
p(shift)
##
##
my($n,@e,$o) = @_;
#note this is the same as:
my $n = $_[0];
my @e = @_;
my $o;
##
##
print if ! $_{$_ = join$",sort@_,$/}++;
##
##
p(5)
outputs 5
calls p(1,4)
outputs 1,4
calls p(2,3)
outputs 2,3
calls(1,1,3)
outputs 1,1,3
calls p(3,2)
calls(2,2,1)
outputs 1,2,2
calls(1,1,2,1)
outputs 1,1,1,2
calls p(4,1)
calls p(3,2,1)
calls p(2,2,1)
calls p(1,1,2,1)
calls p(2,1,1,1)
calls p(1,1,1,1,1)
outputs 1,1,1,1,1