如何计算一个向量与自身N次的笛卡尔积?

3
我正在寻找一个函数,其签名为fn product(vector: &Vec<i32>, n: &i32) -> Vec<Vec<i32>>或类似的。例如:
assert_eq!(
    product(vec![1, 2, 3, 4], 2),
    [
        [1, 1],
        [1, 2],
        [1, 3],
        [1, 4],
        [2, 1],
        [2, 2],
        [2, 3],
        [2, 4],
        [3, 1],
        [3, 2],
        [3, 3],
        [3, 4],
        [4, 1],
        [4, 2],
        [4, 3],
        [4, 4]
    ],
)

我已经尝试使用 itertools 库中的 iproduct

use itertools::iproduct; // 0.10.0

fn product(vector: &Vec<i32>, n: &i32) -> Vec<Vec<i32>> {
    let mut result = Vec::new();

    for _ in 0..*n {
        result = iproduct!(result.iter(), vector.iter()).collect();
    }

    result
}

这会产生以下错误:
error[E0277]: a value of type `Vec<_>` cannot be built from an iterator over elements of type `(&_, &i32)`
 --> src/lib.rs:7:58
  |
7 |         result = iproduct!(result.iter(), vector.iter()).collect();
  |                                                          ^^^^^^^ value of type `Vec<_>` cannot be built from `std::iter::Iterator<Item=(&_, &i32)>`
  |
  = help: the trait `FromIterator<(&_, &i32)>` is not implemented for `Vec<_>`

这个问题怎么解决?
1个回答

2
  1. 你期望 result 的类型是什么?如果它是返回值,那么它必须是 Vec<Vec<i32>>,对吗?但是,iproduct!(result.iter(), vector.iter()) 返回一个 Iterator<Item = (&Vec<i32>, &i32)>(可以通过显式指定 result 的类型来查看),并将一个 Vec<(&Vec<i32>, &i32)> 分配给 result,这是不行的。所以你需要先将 (&Vec<i32>, &i32) 映射到 Vec<i32>

  2. 一开始,result 是空的,所以它和任何东西的乘积都是空的。它需要包含一个元素。这个元素应该是什么?

  3. n 引用传递是没有意义的;同样,最好接受一个切片 &[i32] 而不是一个 &Vec<i32>

如果您修复了所有这些问题,您将得到:
S  
o  
m  
e  

s  
p  
o  
i  
l  
e  
r  

s  
p  
a  
c  
e  

f
o
r

y
o
u

t
o

t
r
y

y
o
u
r
s
e
l
f

Playground

的中文翻译是:

{{链接1:游乐场}}


use itertools::iproduct;

fn product(vector: &[i32], n: i32) -> Vec<Vec<i32>> {
    let mut result: Vec<Vec<i32>> = vec![vec![]];

    for _ in 0..n {
        result = iproduct!(result.iter(), vector.iter())
            .map(|(v, x)| {
                let mut v1 = v.clone();
                v1.push(*x);
                v1
            })
            .collect();
    }

    result
}

我个人会选择使用 flat_map,而不是使用 iproduct


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接