如何在 Perl 中按元素对数组求和?
我有两个数组:
@arr1 = ( 1, 0, 0, 0, 1 );
@arr2 = ( 1, 1, 0, 1, 1 );
我想对两个数组的项目进行求和以获得新的数组,例如
( 2, 1, 0, 1, 2 );
我可以在不循环数组的情况下做到这一点吗?
I have two arrays:
@arr1 = ( 1, 0, 0, 0, 1 );
@arr2 = ( 1, 1, 0, 1, 1 );
I want to sum items of both arrays to get new one like
( 2, 1, 0, 1, 2 );
Can I do it without looping through arrays?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
对于 Perl 5:
for Perl 5:
如果您使用的是 Perl 6:
Perl 6 Advent日历有更多示例。
If you're using Perl 6:
The Perl 6 Advent Calendar has more examples.
从根本上来说,不,如果不“循环遍历数组”就无法做到这一点,因为您需要访问两个数组的每个元素才能对它们求和。到目前为止,这两个答案都只是将循环隐藏在抽象层下,但它仍然存在。
如果您担心循环非常大的数组,最好考虑其他方法来保持总和最新。
Fundamentally, no, you can't do it without "looping through arrays" because you need to access every element of both arrays in order to sum them. Both the answers so far just hide the looping under a layer of abstraction but it's still there.
If you're concerned about looping over very large arrays, it's probably best to consider other ways of keeping the sum up-to-date as you go.
循环数组有什么问题?这就是基本原理。
what's wrong with looping over arrays? that's the fundamentals.
您已经了解了 C 风格的 for 循环和
pairwise
。这是一个惯用的 Perl for 循环和map
:我最喜欢
map
和pairwise
。我不确定我对这两个选项是否有偏好。pairwise
为您处理一些无聊的管道细节,但它不像map
那样是内置的。另一方面,地图解决方案非常惯用,并且对于兼职 Perler 来说可能是不透明的。因此,这两种方法都没有真正的胜利。 IMO,
pairwise
和map
都很好。You've seen a C style for loop, and
pairwise
. Here's an idiomatic Perl for loop andmap
:I like
map
andpairwise
best. I'm not sure that I have a preference between those two options.pairwise
handles some boring details of plumbing for you, but it is not a built-in likemap
. On the other hand, the map solution is very idiomatic, and may be opaque to a part-time perler.So, no real wins for either approach. IMO, both
pairwise
andmap
are good.来自 http://www.perlmonks.org/?node_id=122393
或:
或:
或(在 Perl 6 中):
From http://www.perlmonks.org/?node_id=122393
Or:
Or:
Or (in Perl 6):
如果您真的害怕循环,那么您可以对数组进行二元切割,对对进行求和,然后递归地重新组装结果数组。那里没有循环,作为奖励,您可以了解快速傅立叶变换推导的一部分是如何工作的。
If you're really afraid of looping, then you can binary chop the arrays, sum the pairs, then recursively reassemble the resulting array. No looping there, and as a bonus you get to learn how part of the fast-fourier transform derivation works.
为了避免(显式)循环,这里有一个“替代”使用递归的解决方案:
输出:
请注意,
use v5.20
意味着您不必编写use strict;我认为使用警告。
向@parm 的想法致歉/表示敬意。
To avoid (explicit) looping, here is a solution that uses recursion "instead":
Output:
Note that
use v5.20
means you don't have to writeuse strict; use warnings
, I think.Apologies/kudos to @parm for the idea.
我不确定一旦得到总和后你打算如何处理它,但你计划做更多的向量 y 类型的东西,那么 Math::Matrix 可能是一个不错的选择。
I'm not sure what you plan to do with the sum once you have it, but you plan to do more vector-y type stuff, then Math::Matrix might be a good fit.