免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: pony2001mx
打印 上一主题 下一主题

找出所有组合 [复制链接]

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
11 [报告]
发表于 2014-11-24 18:45 |只看该作者
  不行啊····
你可以删去试试··回复 10# pony2001mx


   

论坛徽章:
0
12 [报告]
发表于 2014-11-24 20:40 |只看该作者
本帖最后由 pony2001mx 于 2014-11-24 21:31 编辑

xiumu2280,谢谢回复,确实是不行的。

我最后再问您三个小问题,
1)关于$ori = dclone($ori_o)语句,我觉得all_result($ori, $data)反复循环不会执行下面的$ori = dclone($ori_o)语句的。当然我的理解肯定不对,请您简单告诉我为什么不循环执行all_result($ori, $data)了。

2)my $e_l = join "",@{$ori_o->[-1]}可以写成my $e_l = join "",@{$ori_o->[2]}吧?

3)36行的return可以省略吗?

非常谢谢!!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
13 [报告]
发表于 2014-11-25 14:44 |只看该作者
回复 1# pony2001mx
试下这个吧:

open DATA,"<","yourfile";

my @data =map {chomp;[split /\s+|-/,$_]}<DATA>;

for my $row (@data){
    if($row->[1] == 1){
        push @arr, $row;
        recursive_get($row,1);
        pop @arr;
    }
}

sub show_result {
    print $arr[0]->[0]," ";
    for(@arr){
        print $_->[1],"-",$_->[2],",";
    }
    print " ";
    for(@arr){
        print $_->[3];
    }
    print "\n";
}

sub recursive_get{
    my $parentrow = shift;
    my $level= shift;

    if($parentrow->[2] == 100){
        show_result;
        return 0;
    }
    for (my $i = 0; $i< @data;$i++){
        if(($data[$i]->[0] eq $parentrow->[0]) && ($data[$i]->[1] == ($parentrow->[2] + 1))){
            push @arr, $data[$i];
  
            recursive_get($data[$i],$level+1);

            pop @arr;
        }
    }
}







   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
14 [报告]
发表于 2014-11-25 14:48 |只看该作者
回复 1# pony2001mx

用这个会简洁一些:
open DATA,"<","yourfile";

my @data =map {chomp;[split /\s+|-/,$_]}<DATA>;

for my $row (@data){
    if($row->[1] == 1){
        push @arr, $row;
        recursive_get($row,1);
        pop @arr;
    }
}

sub show_result {
    print $arr[0]->[0]," ";
    for(@arr){
        print $_->[1],"-",$_->[2],",";
    }
    print " ";
    for(@arr){
        print $_->[3];
    }
    print "\n";
}

sub recursive_get{
    my $parentrow = shift;
    my $level= shift;

    if($parentrow->[2] == 100){
        show_result;
        return 0;
    }
    for my $row (@data){
        if(($row->[0] eq $parentrow->[0]) && ($row->[1] == ($parentrow->[2] + 1))){
            push @arr, $row;
            recursive_get($row,$level+1);
            pop @arr;
        }
    }
}





   

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
15 [报告]
发表于 2014-11-25 17:29 |只看该作者
本帖最后由 xiumu2280 于 2014-11-25 17:30 编辑

你可以看ntwarren的代码,意思一样  但是数据结构上简单多了

1.最终所有的all_result()都会有一个返回的结果。其实是每次all_result()全部深层执行完,再运行的$ori = dclone($ori_o)。因为每次的$ori_o都是下一组符合标准的元素,所以并不会不停的执行下去。这就是写了一个  递归。
2.没问题
3.可以省略,但是没有return的sub感觉很怪···
  1. http://baike.baidu.com/view/96473.htm?fr=aladdin
复制代码
回复 12# pony2001mx


   

论坛徽章:
0
16 [报告]
发表于 2014-11-25 20:08 |只看该作者
非常谢谢ntwarren和xiumu2280!!
我不是计算机专业,但你们的code确实使我产生了极大兴趣。谢谢。

论坛徽章:
0
17 [报告]
发表于 2014-11-27 17:02 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;
  5. use Data::Dumper;
  6. use v5.10;

  7. my %hash;
  8. my %hash0;

  9. while (<DATA>) {

  10.     my @array = split;

  11.     if ( $array[1] =~ /^1/ ) {
  12.         $hash{ $array[0] }{ $array[1] } = undef;
  13.     }

  14.     $hash0{ $array[0] }{ $array[1] }{ $array[2] } = undef;

  15. }

  16. sub analyse_contig_tree_recursively {
  17.     my $it        = shift;
  18.     my $TAXA_TREE = shift;
  19.     foreach ( sort keys %{$TAXA_TREE} ) {

  20.         my @i = split( /-/, $it );
  21.         my @j = split( /-/, $_ );

  22.         if ( ref $TAXA_TREE->{$_} eq 'HASH' ) {
  23.             if ( $i[0] - 1 == $j[1] ) {
  24.                 $TAXA_TREE->{$_}{$it} = undef;
  25.                 analyse_contig_tree_recursively( $it, $TAXA_TREE->{$_} );
  26.             }
  27.             analyse_contig_tree_recursively( $it, $TAXA_TREE->{$_} );
  28.             next;
  29.         }

  30.         if ( $i[0] - 1 == $j[1] ) {
  31.             $TAXA_TREE->{$_}{$it} = undef;
  32.             analyse_contig_tree_recursively( $it, $TAXA_TREE->{$_} );
  33.             next;
  34.         }
  35.     }
  36. }

  37. sub traverse (&$@) {
  38.     my ( $do_it, $data, @path ) = @_;

  39.     # iterate
  40.     foreach my $key ( sort keys %$data ) {

  41.         # handle sub-tree
  42.         if ( ref( $data->{$key} ) eq 'HASH' ) {
  43.             &traverse( $do_it, $data->{$key}, @path, $key );
  44.             next;
  45.         }

  46.         # handle leave
  47.         if ( defined( $data->{$key} ) ) {
  48.             if ( $data->{$key} =~ /100$/ ) {
  49.                 $do_it->( $data->{$key}, @path, $key );
  50.             }
  51.             else {
  52.                 next;
  53.             }
  54.         }
  55.         else {
  56.             if ( $key =~ /100$/ ) {
  57.                 $do_it->( @path, $key );
  58.             }
  59.             else {
  60.                 next;
  61.             }
  62.         }
  63.     }
  64. }

  65. foreach my $a ( sort keys %hash0 ) {
  66.     foreach my $b ( sort keys %{ $hash0{$a} } ) {
  67.         &analyse_contig_tree_recursively( $b, $hash{$a} );
  68.     }
  69. }

  70. #print Dumper \%hash0;

  71. traverse {
  72.     my ($it, @rest) = @_;   
  73.     my @col3;
  74.     foreach(@rest){
  75.         push @col3, keys $hash0{$it}{$_};
  76.     }
  77.     say $it, " @rest", " @col3";
  78. } \%hash;

  79. __DATA__
  80. a   1-30      A
  81. a   9-30      B
  82. a   31-70    D
  83. a   31-100  F
  84. a   71-100  U
  85. b   1-50      J
  86. b   1-90      K
  87. b   51-100   JK
  88. c   1-20      ll
  89. c   21-99     L
复制代码
回复 1# pony2001mx


   

论坛徽章:
0
18 [报告]
发表于 2014-11-27 22:39 |只看该作者
谢谢Perl_Er!对我是很好的学习机会。

论坛徽章:
0
19 [报告]
发表于 2014-11-27 22:40 |只看该作者
回复 17# Perl_Er


    谢谢Perl_Er!对我是很好的学习机会。

论坛徽章:
0
20 [报告]
发表于 2014-12-11 10:00 |只看该作者
本帖最后由 翠微剑歌 于 2014-12-11 10:06 编辑

花时间写了一下,这是我的思路。
  1. use strict;

  2. my @data = map {chomp;[split /\s+|-/,$_]} @_ = <DATA>;
  3. my $hash;
  4. $hash->{$_->[0]}->{$_->[1]}->{$_->[2]} = $_->[3] for (@data);

  5. for my $k1 (sort keys %{$hash}) {
  6.         &search($k1, "1", []);
  7. }

  8. sub search {
  9.         my ($k1, $k2, $path) = @_;
  10.         for my $k3 (sort {$a <=> $b} keys %{$hash->{$k1}->{$k2}}) {
  11.                 push @{$path}, [$k2, $k3];
  12.                 if ($k3 eq '100') {
  13.                         my $s1 = join ",", map { join "-", @{$_} } @{$path};
  14.                         my $s2 = join "", map {$hash->{$k1}->{$_->[0]}->{$_->[1]}} @{$path};
  15.                         print "$k1\t$s1\t$s2\n";
  16.                         pop @{$path};
  17.                         last;
  18.                 } else {
  19.                         &search($k1, $k3+1, $path) if (exists $hash->{$k1}->{$k3+1});
  20.                         pop @{$path};
  21.                 }
  22.         }
  23. }

  24. __DATA__
  25. a   1-30      A
  26. a   9-30      B
  27. a   31-70    D
  28. a   31-100  F
  29. a   71-100  U
  30. b   1-50      J
  31. b   1-90      K
  32. b   51-100   JK
  33. c   1-20      ll
  34. c   21-99     L
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP