Rust 如何使用迭代器和范围创建阶乘的非递归计算?

Rust 如何使用迭代器和范围创建阶乘的非递归计算?,rust,iterator,non-recursive,Rust,Iterator,Non Recursive,我遇到了一个不断困扰我的沙沙声练习: pub fn factorial(num: u64) -> u64 { // Complete this function to return factorial of num // Do not use: // - return // For extra fun don't use: // - imperative style loops (for, while) // - additional var

我遇到了一个不断困扰我的沙沙声练习:

pub fn factorial(num: u64) -> u64 {
    // Complete this function to return factorial of num
    // Do not use:
    // - return
    // For extra fun don't use:
    // - imperative style loops (for, while)
    // - additional variables
    // For the most fun don't use:
    // - recursion
    // Execute `rustlings hint iterators4` for hints.
}
一个解决方案的提示告诉我

在命令式语言中,可以编写for循环进行迭代 通过将这些值乘以一个可变变量。或者你可以 使用递归和match子句编写功能更强的代码。但是 您还可以使用范围和迭代器在rust中解决此问题

我尝试过这种方法,但我遗漏了一些东西:

if num > 1 {
    (2..=num).map(|n| n * ( n - 1 ) ??? ).???
} else {
    1
}

我是否必须使用类似于
的东西。在
时取u,而不是
如果

阶乘被定义为从起始数字到1的所有数字的乘积。我们使用该定义,并:

如果您查看整数的
Product
,您将看到它在引擎盖下使用:

另见:


看看num>1{(2..=num).fold(1,| acc,n | acc*n)}否则{1}与fold一起工作非常完美!thx对于那件事你甚至不需要特殊的情况
好吧。。。这是真的,我甚至没有意识到。。。锈对我来说仍然很神奇;哇!我怎么会错过这个呢??很多
fn factorial(num: u64) -> u64 {
    (1..=num).product()
}
impl Product for $a {
    fn product<I: Iterator<Item=Self>>(iter: I) -> Self {
        iter.fold($one, Mul::mul)
    }
}
fn factorial(num: u64) -> u64 {
    (1..=num).fold(1, |acc, v| acc * v)
}