2014-01-21 73 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"); 
}