【问题标题】:make all possible combinations in perl在 perl 中进行所有可能的组合
【发布时间】:2014-01-21 10:35:59
【问题描述】:

我想从数组中的元素进行所有可能的组合,但我不知道如何做到这一点,只是有点聪明。

我的数组如下所示:

@array = ('a', 'b', 'c', 'd', 'e', 'f');

我希望得到这样的输出:

a
ab
abc
abcd
abcde
abcdef
abcdf
abce
abcef
...

etc

所有组合都没有重叠(例如 ab 和 ba)。并且具有从 1-6 的任意数量的元素。顺序无所谓

【问题讨论】:

    标签: arrays perl combinations


    【解决方案1】:

    见Math::Subsets::List:

    use Math::Subsets::List;
    subsets {say "@_"} qw(a b c);
    #
    #  a
    #  b
    #  c
    #  a b
    #  a c
    #  b c
    #  a b c 
    

    【讨论】:

    • 对不起,我是新手,我需要安装什么才能使用它吗?
    • 我认为用户想要得到问题的算法,而不是仅仅使用模块来实现。
    • 不管是算法还是模块(我不确定如何使用),但我在服务器上工作,我不允许安装任何东西。
    • @JackXu: 源代码可在链接页面上一键点击。
    • 源码难懂……变量名难懂……
    【解决方案2】:

    Algorithm::Combinatorics 模块完全符合您的要求:

    Math::Combinatorics 模块也可以。

    【讨论】:

    • 我确实已经看过 Math::Combinatorics。但据我所知,它只生成包含所有元素(例如 abcdef)的输出,而不是例如 abc
    【解决方案3】:

    所以你想要

    for my $s0 ($array[0], '') {
       for my $s1 ($array[1], '') {
          for my $s2 ($array[2], '') {
             ...
                print(join('', $s1, $s2, $s3, ...), "\n");
             ...
          }
       }
    }
    

    当您想要任意嵌套循环时,使用Algorithm::Loops 的NestedLoops。

    use Algorithm::Loops qw( NestedLoops );
    
    NestedLoops(
       [ map { $_, "" } @array ],
       sub { print(join('', @_), "\n"); },
    );
    

    但您可能会注意到这些循环中的每一个都有两种状态。二进制!很少有人听到就可以做到。

    my $num_bits = @array;
    my $last = ~( -1 << $num_bits );
    my $high_bit_mask = 1 << ( $num_bits - 1 );
    
    for (my $i = $last; $i--; ) {
       my $s = '';
       my $mask = $high_bit_mask;
       for my $bit_num (0..$num_bits) {
          $s .= $array[$bit_num] if $i & $mask;
          $mask >>= 1;
       }
    
       print("$s\n");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-05
      • 2018-07-26
      • 1970-01-01
      • 2014-02-24
      • 2019-02-13
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多