首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Perl的数学::组合学抱怨“必须使用next_permutation的‘频率’参数没有传递给构造函数”?

为什么Perl的数学::组合学抱怨“必须使用next_permutation的‘频率’参数没有传递给构造函数”?
EN

Stack Overflow用户
提问于 2010-09-18 10:36:03
回答 2查看 396关注 0票数 2

我试图使用Math::组合学来生成数组的唯一排列。正如CPAN页面说的那样,可以使用next_string()来完成它:

代码语言:javascript
复制
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,而不是传递给构造函数,我不明白为什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-18 10:45:02

你在那个项目上有很多问题。数据类型不匹配。

如果要使用frequency,则只指定唯一元素一次,但指定它们出现的次数。对频率的数组引用必须与数据数组相同的长度:

代码语言:javascript
复制
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之间的区别:

代码语言:javascript
复制
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,则只需指定数据数组中的所有元素即可。但是,您可能会避免这样做,因为它将每个元素视为不同的元素,这样就不会折叠看起来类似于同一个组合的元素。

票数 6
EN

Stack Overflow用户

发布于 2010-09-18 10:44:06

虽然我没有使用这个包,但文献资料说频率必须与数据构造函数参数的长度相同。

在你的例子中,长度是不一样的,所以这可能是问题所在。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3741340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档