我试图使用Math::组合学来生成数组的唯一排列。正如CPAN页面说的那样,可以使用next_string()来完成它:
use Math::Combinatorics;
my @arr = [1,1,1,0,0];
$c = Math::Combinatorics->new( count=>5, data=>[\@arr], frequency=>[3,2] );
while (@permu = $c->next_string()){
print "@permu\n";
} 然而,这段代码给出了以下错误:必须使用“频率”参数的next_permutation,而不是传递给构造函数,我不明白为什么。
发布于 2010-09-18 10:45:02
你在那个项目上有很多问题。数据类型不匹配。
如果要使用frequency,则只指定唯一元素一次,但指定它们出现的次数。对频率的数组引用必须与数据数组相同的长度:
use Math::Combinatorics;
my @array = (1,0); # an array, not an array reference
$c = Math::Combinatorics->new(
count => 5,
data => \@array, # now you take a reference
frequency => [3,2]
);
while (@permu = $c->next_string ){
print "@permu\n";
}现在,您应该得到所需的输出,这是不同的组合,在这些组合中,您无法区分多个1和多个0之间的区别:
0 1 1 1 0
0 1 1 0 1
0 1 0 1 1
0 0 1 1 1
1 0 1 1 0
1 0 1 0 1
1 0 0 1 1
1 1 0 1 0
1 1 0 0 1
1 1 1 0 0如果不使用frequency,则只需指定数据数组中的所有元素即可。但是,您可能会避免这样做,因为它将每个元素视为不同的元素,这样就不会折叠看起来类似于同一个组合的元素。
发布于 2010-09-18 10:44:06
虽然我没有使用这个包,但文献资料说频率必须与数据构造函数参数的长度相同。
在你的例子中,长度是不一样的,所以这可能是问题所在。
https://stackoverflow.com/questions/3741340
复制相似问题