首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Math::Cartesian::Product返回受祝福的对象?

为什么Math::Cartesian::Product返回受祝福的对象?
EN

Stack Overflow用户
提问于 2010-12-13 20:15:51
回答 3查看 426关注 0票数 1

我注意到Math::Cartesian::Product返回一个受祝福的对象数组,而不是一个简单的数组数组。我不知道为什么。我实际上需要做一些额外的工作来使用结果...

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-13 21:46:30

一种替代方法是模块Set::CrossProduct,它将产生普通的、无福的数组引用:

代码语言:javascript
复制
use Set::CrossProduct;
my $iter = Set::CrossProduct->new([ \@foo, \@bar ]);

while (my $tuple = $iter->get){
    ...
}

或者一次获取所有元组:

代码语言:javascript
复制
my @tuples = $iter->combinations;
票数 2
EN

Stack Overflow用户

发布于 2010-12-14 11:46:32

我最近在List::Gen中添加了一个cartesian函数:

  • cartesian CODE LIST_of_ARRAYREF

cartesian计算任意数量的数组ref的笛卡尔乘积,每个数组ref可以是任意大小。返回生成器

使用List::Gen ' cartesian ';my $product =cartesian {$_ .$_1} qw/a b/,1,2;print "@$product";# 'a1 a2 b1 b2'

返回的“生成器”是一个延迟绑定数组,它将在请求值时生成值。还有迭代和其他访问器方法:

代码语言:javascript
复制
my $pairs = cartesian {@_} [qw/$ @ %/], ['a'..'z'], [1 .. 3];

while (my @tuple = $pairs->next) {  # $pairs->reset; #$pairs->index = 5; ...
    print @tuple, ', ';
}
# $a1, $a2, $a3, $b1, $b2, $b3, $c1, $c2, $c3, $d1, $d2, $d3, $e1 ...

我不知道您要处理的集合有多大,但使用上述方法的优点是生成器的存储需求仍然是O(1)

代码语言:javascript
复制
my $digits = cartesian {join '' => @_} ([0..9]) x 10;

say for @$digits[10**9 - 3 .. 10**9 + 3];

#   0999999998
#   0999999999
#   1000000000
#   1000000001
#   1000000002
#   1000000003

它只计算集合中的6个元素,并且不存储任何内容。

从示例中可以看到,coderef本身的返回值是一个生成器对象,但是该对象的后续返回值是cartesian传递给cartesian的返回值。因此,如果您想要数组引用,它就像cartesian {\@_} ...一样简单

另外,你还做了哪些额外的工作来处理这个神圣的引用呢?除了ref将返回的内容之外,受祝福的数组在任何意义上都仍然是数组。如果你正在编写基于引用类型的开关逻辑,那么你应该使用Scalar::Utilreftype

票数 4
EN

Stack Overflow用户

发布于 2010-12-13 20:48:51

它对cartesian返回的数组进行加持,以便在运行以下代码时

代码语言:javascript
复制
$b = $cartesian $a1, $a2;
$c = $cartesian $b, $a3;

..。它可以检测到$b是先前调用模块的结果。

做笛卡尔乘积操作是一件微不足道的事情,如果该模块返回的数据不符合您的需求,请考虑自己从头开始编写操作。

无论如何,检查模块源代码会发现它并不是太好。

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

https://stackoverflow.com/questions/4428705

复制
相关文章

相似问题

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