Occasionally I wish I hadn't given away most of my math
books, this is one of those occasions. I had a book with
lots about partitions in it, but I long ago gave it away.
However this problem is quite doable. The trick is to make
P a function of 2 variables, first the number n you are
interested in partitioning, and then the number i that is
the largest number you are willing to partition it into.
With that tip, here is an answer in 90 characters:
sub P {
my($n,$i)=@_;$i||=$n;$i-1?map{my$c=$_;map[($i)x$c,@$_],P($n-$c*$i,$i-1
+)}0..$n/$i:[(1)
x$n]
}