2016-02-12 54 views
-1
sub partition { 
    print "@_\n"; 
    my ($largest, @rest) = @_; 
    my $min = $rest[0] || 1; 
    my $max = int($largest/2); 
    for my $n ($min .. $max) { 
     partition($largest - $n, $n, @rest); 
    } 
} 

我發現這個代碼互聯網如果用作 &partition(number),打印所有可能的分區上的所有可能的分區,但我希望它分配所有可能的分區稱爲$numbers一個 變量。任何一個可以修改此做出這樣的:如何找到一些

&partition(3); 
#and assigns them to $numbers like this 
$numbers = "1+1+1:1+2:2+1"; 

上面的代碼打印出每一個可能的分區,但是沒有找到 每一個可能的組合。

+0

我怕你將不得不擴大一點來解釋你的人生是什麼算法使用。給定一個輸入選擇,期望的輸出是什麼? – Sobrique

+0

當我使用這個子程序和分區(3)時,我想要做這個任務:$ numbers =「1 + 1 + 1:1 + 2:2 + 1」。 – D4NTE

+0

你做這個修改時遇到了什麼問題? – Sobrique

回答

0

方法1:

sub partition { 
    my @partitions = join("+", @_); 

    my ($largest, @rest) = @_; 
    my $min = $rest[0] || 1; 
    my $max = int($largest/2); 
    for my $n ($min .. $max) { 
     push @partitions, partition($largest - $n, $n, @rest); 
    } 

    return join(':', @partitions); 
} 

方法2:(使用較少的內存)

sub partition { 
    my @partitions; 

    local *_partition = sub { 
     push @partitions, join("+", @_); 

     my ($largest, @rest) = @_; 
     my $min = $rest[0] || 1; 
     my $max = int($largest/2); 
     for my $n ($min .. $max) { 
      _partition($largest - $n, $n, @rest); 
     } 
    }; 

    _partition(@_); 
    return join(':', @partitions); 
}