my $n = 5; print "P({1..$n)={",join(",",map { "{".join(",",@$_)."}" } P(1..$n)),"}\n"; sub P(@) { return [] unless (@_); my $x = shift @_; return (P(@_), map { [ $x, @$_] } P(@_)); }