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)
}