免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4315 | 回复: 2
打印 上一主题 下一主题

求助:用perl如何实现数组元素的组合 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-16 15:38 |只看该作者 |倒序浏览
本帖最后由 流星北 于 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)

请高手解答!

论坛徽章:
0
2 [报告]
发表于 2010-12-16 17:29 |只看该作者
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use warnings;

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

  5. my %hash;


  6. main(@ARGV);
  7. sub main{
  8.         my $size = 6;
  9.         foreach(@array){
  10.                 check($_,$size);
  11.         }
  12.         foreach(sort keys %hash){
  13.                 print $_."\n";
  14.         }
  15. }

  16. sub check{
  17.         my $value = shift || "";
  18.         my $size = shift;
  19.         my @tmpList;
  20.        
  21.         foreach(@array){
  22.                 if($value !~ /$_/){#这个正则有些问题,0的时候竟然永远是真,所以用a代替
  23.                         push(@tmpList,$_);
  24.                 }
  25.         }
  26.        
  27.         foreach(@tmpList){
  28.                 my $tmpValue = "$value"."$_";
  29.                
  30.                
  31.                 if(length($tmpValue) == $size){
  32.                         $hash{$tmpValue} = '';
  33.                         next;       
  34.                 }
  35.                 elsif(length($tmpValue) > $size){
  36.                         return;
  37.                 }
  38.                 &check($tmpValue,$size);
  39.         }
  40. }
复制代码
将开始的size换成你要设置的.

论坛徽章:
0
3 [报告]
发表于 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=数组元素个数, 分数为所有分数的和
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP