流星北 发表于 2010-12-16 15:38

求助:用perl如何实现数组元素的组合

本帖最后由 流星北 于 2010-12-16 15:40 编辑

假如:有一个10个元素的数组@num=(1,2,3,4,5,6,7,8,9,10),我想要得到这个数组所有可能的组合,如何实现,请高手赐代码!
具体如:

元素个数为1的所有组合是,(1),(2),(3).....(10),即每一个元素为一个组合

元素个数为2的所有组合为,(1,2),(1,3),(1,4).....,(1,10),(2,3),(2,4).......(2,10),.........(8,9),(8,10),(9,10)

元素个数为3的所有组合为,(1,2,3),(1,2,4).....(1,2,10),(1,3,4).....(1,3,10),.......(8,9,10)
.
.
.
元素个数为10的组合数为,(1,2,3,4,5,6,7,8,9,10)

请高手解答!

phoenix_perl 发表于 2010-12-16 17:29

#!/usr/bin/perl -w
use strict;
use warnings;

my @array = (1..9,'a');

my %hash;


main(@ARGV);
sub main{
        my $size = 6;
        foreach(@array){
                check($_,$size);
        }
        foreach(sort keys %hash){
                print $_."\n";
        }
}

sub check{
        my $value = shift || "";
        my $size = shift;
        my @tmpList;
       
        foreach(@array){
                if($value !~ /$_/){#这个正则有些问题,0的时候竟然永远是真,所以用a代替
                        push(@tmpList,$_);
                }
        }
       
        foreach(@tmpList){
                my $tmpValue = "$value"."$_";
               
               
                if(length($tmpValue) == $size){
                        $hash{$tmpValue} = '';
                        next;       
                }
                elsif(length($tmpValue) > $size){
                        return;
                }
                &check($tmpValue,$size);
        }
}
将开始的size换成你要设置的.

流星北 发表于 2010-12-16 19:52

本帖最后由 流星北 于 2010-12-16 20:03 编辑

回复 2# phoenix_perl


    大哥你的代码实现了这个功能,但我希望你能帮我在我这个类型的数据上实现类似的功能。
BCL2        0.999
BCL2L1        0.999
CYCS        0.999
TP53        0.999
BBC3        0.996
BCL2L11        0.996
XRCC6        0.995
MAPK8        0.995       
SH3GLB1        0.993
CASP3      0.991
TP53BP2        0.99
BID        0.988

我要 求前面列所有可能组合的分数的和
如:当n=1时,是对应分数本身,(BCL2对应的分数为0.999),...(FOXO3A对应的分数为0.81)
    当n=2时,求所有可能的两个元素组合的分数的和,(BCL2和BCL2L1对应的分数是0.999+0.999)......(TP53BP2,BID对应的分数是0.99+0.988)
    .
      .
      .
当n=数组元素个数, 分数为所有分数的和
页: [1]
查看完整版本: 求助:用perl如何实现数组元素的组合