我想從數組中的元素中創建所有可能的組合,但我不知道如何做到這一點,只是一點點聰明。在perl中創建所有可能的組合
我的數組是這樣的:
@array = ('a', 'b', 'c', 'd', 'e', 'f');
,我希望得到的輸出是這樣的:
a
ab
abc
abcd
abcde
abcdef
abcdf
abce
abcef
...
etc
與所有的組合,沒有重疊(例如AB和BA)。並且具有從1-6的任何數目的元素。順序並不重要
我想從數組中的元素中創建所有可能的組合,但我不知道如何做到這一點,只是一點點聰明。在perl中創建所有可能的組合
我的數組是這樣的:
@array = ('a', 'b', 'c', 'd', 'e', 'f');
,我希望得到的輸出是這樣的:
a
ab
abc
abcd
abcde
abcdef
abcdf
abce
abcef
...
etc
與所有的組合,沒有重疊(例如AB和BA)。並且具有從1-6的任何數目的元素。順序並不重要
Algorithm::Combinatorics模塊不正是你想要什麼:
Math::Combinatorics模塊會了。
我已經看過Math :: Combinatorics。但據我所知,它只產生一個包含所有元素的輸出(例如abcdef),而不是abc – user2335015
use Math::Subsets::List;
subsets {say "@_"} qw(a b c);
#
# a
# b
# c
# a b
# a c
# b c
# a b c
對不起,我是一個新手,我需要安裝任何東西來使用它嗎? – user2335015
我認爲用戶想要得到問題的算法,不僅要用模塊來實現它。 – JackXu
它不是問題,如果它是算法或模塊(我不知道如何使用),但我工作的服務器,我不允許安裝任何東西。 – user2335015
所以,你要
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");
}
CPAN是你的朋友 – gaussblurinc