<?xml version="1.0" encoding="windows-1252"?>
<node id="393792" title="Re: Generator of integer partitionts of n" created="2004-09-25 10:40:02" updated="2005-07-07 11:52:07">
<type id="11">
note</type>
<author id="180961">
Limbic~Region</author>
<data>
<field name="doctext">
[chiburashka],
&lt;br /&gt;
Here is an iterative solution that produces output in ascending order and is about twice as fast as [blokhead]'s in my rudimentary benchmarks.
&lt;CODE&gt;
#!/usr/bin/perl
use strict;
use warnings;

my $numb = $ARGV[ 0 ] || 10;
my $iter = partition( $numb );

while ( my @part = $iter-&gt;() ) {
    print "@part\n";
}

sub partition {
    my $target = shift;
    return sub { () } if ! $target || $target =~ /\D/;

    my @part = (0, (1) x ($target - 1));
    my $done = undef;

    return sub {
        return () if $done;

        my $min = $part[ -2 ];
        my $total = $part[ 0 ] ? 0 : 1;
        my $index = 0;

        for ( 0 .. $#part - 1) {
            if ( $part[ $_ ] &gt; $min ) {
                $total += $part[ $_ ]; 
                next;
            }
            $index = $_;
            last;
        }
        $part[ $index ]++; 

        $total += $part[ $index ];
        if ( $total &gt; $target || $part[ $index ] &gt; $part[ 0 ] ) {
            @part = ( $index ? ++$part[ 0 ] : $part[ 0 ], (1) x ($target - $part[ 0 ]) );
        } 
        else {
            @part = ( @part[ 0 .. $index ], (1) x ($target - $total) );
            push @part , 1 if $part[ 0 ] == 1;
        }

        $done = 1 if $part[ 0 ] == $target;
        return @part;
    }
}
&lt;/CODE&gt;
I am sure it could probably be improved a bit more but it is working and that's what's important.
&lt;div class="pmsig"&gt;&lt;div class="pmsig-180961"&gt;
&lt;p&gt;
Cheers - [Limbic~Region|L~R]
&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;</field>
<field name="root_node">
386531</field>
<field name="parent_node">
386531</field>
</data>
</node>
