2014-01-21 40 views
0

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

我的数组是这样的:

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

,我希望得到的输出是这样的:

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

etc 

与所有的组合,没有重叠(例如AB和BA)。并且具有从1-6的任何数目的元素。顺序并不重要

+1

CPAN是你的朋友 – gaussblurinc

回答

3

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 
+0

对不起,我是一个新手,我需要安装任何东西来使用它吗? – user2335015

+0

我认为用户想要得到问题的算法,不仅要用模块来实现它。 – JackXu

+0

它不是问题,如果它是算法或模块(我不知道如何使用),但我工作的服务器,我不允许安装任何东西。 – user2335015

0

所以,你要

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

使用Algorithm::LoopsNestedLoops当你想随意嵌套循环。

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"); 
}