2024-06-28 09:31:15 -04:00
|
|
|
// 3 possible solutions are presented.
|
|
|
|
|
|
|
|
// With `for` loop and a mutable variable.
|
|
|
|
fn factorial_for(num: u64) -> u64 {
|
|
|
|
let mut result = 1;
|
|
|
|
|
|
|
|
for x in 2..=num {
|
|
|
|
result *= x;
|
|
|
|
}
|
|
|
|
|
|
|
|
result
|
|
|
|
}
|
|
|
|
|
|
|
|
// Equivalent to `factorial_for` but shorter and without a `for` loop and
|
|
|
|
// mutable variables.
|
|
|
|
fn factorial_fold(num: u64) -> u64 {
|
|
|
|
// Case num==0: The iterator 2..=0 is empty
|
|
|
|
// -> The initial value of `fold` is returned which is 1.
|
|
|
|
// Case num==1: The iterator 2..=1 is also empty
|
|
|
|
// -> The initial value 1 is returned.
|
|
|
|
// Case num==2: The iterator 2..=2 contains one element
|
|
|
|
// -> The initial value 1 is multiplied by 2 and the result
|
|
|
|
// is returned.
|
|
|
|
// Case num==3: The iterator 2..=3 contains 2 elements
|
|
|
|
// -> 1 * 2 is calculated, then the result 2 is multiplied by
|
|
|
|
// the second element 3 so the result 6 is returned.
|
|
|
|
// And so on…
|
|
|
|
(2..=num).fold(1, |acc, x| acc * x)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Equivalent to `factorial_fold` but with a built-in method that is suggested
|
|
|
|
// by Clippy.
|
|
|
|
fn factorial_product(num: u64) -> u64 {
|
|
|
|
(2..=num).product()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
// You can optionally experiment here.
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn factorial_of_0() {
|
|
|
|
assert_eq!(factorial_for(0), 1);
|
|
|
|
assert_eq!(factorial_fold(0), 1);
|
|
|
|
assert_eq!(factorial_product(0), 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn factorial_of_1() {
|
|
|
|
assert_eq!(factorial_for(1), 1);
|
|
|
|
assert_eq!(factorial_fold(1), 1);
|
|
|
|
assert_eq!(factorial_product(1), 1);
|
|
|
|
}
|
|
|
|
#[test]
|
|
|
|
fn factorial_of_2() {
|
|
|
|
assert_eq!(factorial_for(2), 2);
|
|
|
|
assert_eq!(factorial_fold(2), 2);
|
|
|
|
assert_eq!(factorial_product(2), 2);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn factorial_of_4() {
|
|
|
|
assert_eq!(factorial_for(4), 24);
|
|
|
|
assert_eq!(factorial_fold(4), 24);
|
|
|
|
assert_eq!(factorial_product(4), 24);
|
|
|
|
}
|
|
|
|
}
|