My $0.02:
#! /usr/bin/perl -w
use strict;
sub partitions { my $n = shift; return partmax($n, $n) };
sub partmax {
my ($n, $maxpart) = @_;
return [] if $n < 0;
return [[]] if $n == 0;
my $partitions = [];
foreach my $part (reverse 1..$maxpart) {
my $subpartitions = partmax($n - $part, $part);
foreach (@$subpartitions) {
unshift @$_, $part;
}
push @$partitions, @$subpartitions;
}
return $partitions;
}
my $example = partitions shift;
print scalar @$example, "\n";
foreach my $partition (@$example) {
print join(" ", @$partition), "\n";
}