Functional programming 使用函数编程方法在网格的(x,y)位置上迭代
我想在二维网格中迭代位置Functional programming 使用函数编程方法在网格的(x,y)位置上迭代,functional-programming,rust,Functional Programming,Rust,我想在二维网格中迭代位置(x,y),并为每个位置调用一个函数(提供x和y作为参数)。我知道如何使用for循环来实现这一点,但我想使用函数式编程方法来编写它,以便以后可以利用像Rayon这样的库。我已经设法建立了一个功能版本,但它似乎很复杂,我想问是否有一个更干净的方法来实现这一点 下面是计算网格中所有2x2面片的最大和的一个小示例: use std::cmp::max; const WIDTH: usize = 4; const HEIGHT: usize = 3; type Grid =
(x,y)
,并为每个位置调用一个函数(提供x
和y
作为参数)。我知道如何使用for
循环来实现这一点,但我想使用函数式编程方法来编写它,以便以后可以利用像Rayon这样的库。我已经设法建立了一个功能版本,但它似乎很复杂,我想问是否有一个更干净的方法来实现这一点
下面是计算网格中所有2x2面片的最大和的一个小示例:
use std::cmp::max;
const WIDTH: usize = 4;
const HEIGHT: usize = 3;
type Grid = [[u32; WIDTH]; HEIGHT];
fn main() {
let grid: Grid = [
[1, 3, 5, 8],
[3, 9, 4, 2],
[3, 4, 5, 0],
];
let coords = (0..WIDTH - 1).flat_map(|x| (0..HEIGHT - 1).map(move |y| (x, y)));
let max_sum = coords.map(|(x, y)| sum_2x2(x, y, &grid)).max().unwrap();
println!("Max 2x2 patch: {}", max_sum);
}
fn sum_2x2(x: usize, y: usize, grid: &Grid) -> u32 {
[
grid[y][x],
grid[y][x + 1],
grid[y + 1][x],
grid[y + 1][x + 1],
]
.iter()
.sum()
}
直线let-coords=let-coords=(0..WIDTH-1).平面地图(|x |(0..HEIGHT-1).地图(move | y |(x,y))代码>对于这样一个简单的任务来说似乎相当复杂。在Python中,我将执行以下操作以获得位置(我认为这要干净得多):
来自itertools导入产品的>>
>>>产品(范围(高度-1)、范围(宽度-1))
有没有更好的方法来编写此代码,还是我只需要习惯它?您可以使用或之类的循环理解框来简化代码。
例如,对于
,使用map\u:
let max_sum = map_for!(
move;
x <- 0..WIDTH-1;
y <- 0..HEIGHT-1;
=> sum_2x2(x, y, &grid)
).max().unwrap();
让max\u sum=map\u表示!(
移动
x另一个选项是使用Itertools板条箱,它有许多涉及迭代器的方便方法
use itertools::Itertools;
(0..WIDTH-1).cartesian_product(0..HEIGHT-1).map(|(x, y)| sum_2x2(x, y, &grid)).max()
正如@hellow在评论中指出的,板条箱中有一个宏可以满足我的需要。使用它,我的代码可以像这样重写:
use itertools::iproduct;
...
let coords = iproduct!(0..WIDTH - 1, 0..HEIGHT - 1);
...
这正是我想要的。感谢所有在这里评论/发布答案的人
PS:如果您想将itertools迭代器与人造丝一起使用,您可以通过使用以下方法来实现:例如,IPProduct!(0..WIDTH-1,0..HEIGHT-1)。par_iter()
。我花了一段时间才弄明白,因为par\u iter
和into\u par\u iter
不起作用。提出了一个很好的问题,可能会在CodeReview上找到一个更好的归宿。我担心这与Stackoverflow无关,但我可以为这项工作推荐itertools。请记住,上面的示例代码是离题的。所以请确保不要导出请以您的代码为例,但要明确指出您正在寻找[[u32;WIDTH];HEIGHT]中的最大值
array,找到了一个解决方案,但感觉应该有一个更实用的方法。请记住,交叉发布是不受欢迎的。迭代器中的-1
似乎不正确,因为已经不包括上限。
我也这么认为,直到我注意到sum_2x2
转到x+1
和y+1