n个范围的笛卡尔积

3

我正在将一个Python程序重写成Rust,但是我无法翻译这一行:

itertools.product(range(0,8), repeat=n)

我的目标是实现类似于这样的东西:https://pastebin.com/ceEA5E3q(但是我可以更改数字的数量)。

产生的集合不必是元组(最好不要是元组)

我尝试编写一个宏来生成这些迭代器,因为它们有效:

2 => iproduct!(0..8, 0..8)

3 => iproduct!(0..8, 0..8, 0..8)

4 => iproduct!(0..8, 0..8, 0..8, 0..8)

等等。

然而,过了一会儿我没能创建这样的宏。

我想出了这个奇怪的hack:

steps = 3;
for idx in 0..8_u128.pow(steps as u32) {
    let moves: Vec<u8> = format!("{:0fill$o}", idx, fill = steps)
        .chars()
        .map(|d| d.to_digit(10).unwrap() as u8)
        .collect();
    println!("{:?}", moves);
}

我正在创建一个包含零填充的八进制数的字符串,然后迭代数字并将它们转换为数字的Vec。虽然它可以工作,但我觉得执行所有这些操作,特别是使用字符串,会对我的性能产生负面影响。


1个回答

4

我认为你可以使用Itertools::multi_cartesian_product:

std::iter::repeat(0..8).take(n).multi_cartesian_product()

或者

(0..n).map(|_| 0..8).multi_cartesian_product()

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