gpt4 book ai didi

fold - Rust 中的折叠问题

转载 作者:行者123 更新时间:2023-11-29 07:56:32 25 4
gpt4 key购买 nike

让我们假设 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)
}

我得到了正确的结果。我试图通过在给定的值范围内 folding 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) })
}

这似乎只返回正确结果的一个子集。我究竟做错了什么? TIA。

最佳答案

当您zip 两个迭代器时,您并不是在创建迭代的“产品”,就像您似乎想要做的那样。相反,您同时迭代两个迭代器并创建一对具有迭代值的迭代器。所以在 count_fold 版本中,闭包只会用以下对调用:

(-1, -1)
(0, 0)
(1, 1)

所以您的count_fold 函数实际上类似于

scan(x - 1, y - 1) + scan(x, y) + scan(x - 1, y + 1)

我可能是错的,但我认为 std 中没有创建两个迭代器的乘积的函数。

此外,您的count 方法在总和中没有使用scan(x, y),因此它甚至不是迭代器的真正乘积;如果您想创建自己的产品迭代器并将其用于该目的,则必须小心这一点。

关于fold - Rust 中的折叠问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20433555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com