我们假设fn scan(int, int) -> int.
使用时
fn count(x: int, y: int) -> int
{
scan(x - 1, y - 1) + scan(x - 1, y) + scan(x - 1, y + 1) + scan(x, y - 1)
+ scan(x, y + 1) + scan(x + 1, y - 1) + scan(x + 1, y) + scan(x + 1, y + 1)
}
Run Code Online (Sandbox Code Playgroud)
我得到了正确的结果.我想通过获得相同的结果fold荷兰国际集团将scan在给定值范围功能; 但是,我似乎无法做对.我目前的尝试是
fn count_fold(x: int, y: int) -> int
{
std::iter::range_inclusive(-1, 1).zip(std::iter::range_inclusive(-1, 1)).fold(0, |a, (i, j)| { a + scan(x + i, y + j) })
}
Run Code Online (Sandbox Code Playgroud)
这似乎只返回正确结果的一个子集.我究竟做错了什么?TIA.
当你压缩两个迭代器时,你不是在创建迭代的"产品",就像你似乎想要做的那样.相反,您同时迭代两个迭代器并使用迭代值创建一对.因此在count_fold版本中,只会使用以下对调用闭包:
(-1, -1)
(0, 0)
(1, 1)
Run Code Online (Sandbox Code Playgroud)
所以你的count_fold功能实际上类似于
scan(x - 1, y - 1) + scan(x, y) + scan(x - 1, y + 1)
Run Code Online (Sandbox Code Playgroud)
我可能是错的,但我认为没有一个函数std可以创建两个迭代器的产品.
而且,你的count方法不使用scan(x, y)总和,所以它甚至不是迭代器的产物; 如果你想创建自己的产品迭代器并将其用于此目的,你必须要小心.
| 归档时间: |
|
| 查看次数: |
1659 次 |
| 最近记录: |