iterators4 solution

This commit is contained in:
mo8it 2024-06-28 15:31:15 +02:00
parent 56a9197f55
commit 2af437fd90
3 changed files with 80 additions and 10 deletions

View file

@ -1,9 +1,9 @@
fn factorial(num: u64) -> u64 { fn factorial(num: u8) -> u64 {
// Complete this function to return the factorial of num // TODO: Complete this function to return the factorial of `num`.
// Do not use: // Do not use:
// - early returns (using the `return` keyword explicitly) // - early returns (using the `return` keyword explicitly)
// Try not to use: // Try not to use:
// - imperative style loops (for, while) // - imperative style loops (for/while)
// - additional variables // - additional variables
// For an extra challenge, don't use: // For an extra challenge, don't use:
// - recursion // - recursion
@ -19,20 +19,20 @@ mod tests {
#[test] #[test]
fn factorial_of_0() { fn factorial_of_0() {
assert_eq!(1, factorial(0)); assert_eq!(factorial(0), 1);
} }
#[test] #[test]
fn factorial_of_1() { fn factorial_of_1() {
assert_eq!(1, factorial(1)); assert_eq!(factorial(1), 1);
} }
#[test] #[test]
fn factorial_of_2() { fn factorial_of_2() {
assert_eq!(2, factorial(2)); assert_eq!(factorial(2), 2);
} }
#[test] #[test]
fn factorial_of_4() { fn factorial_of_4() {
assert_eq!(24, factorial(4)); assert_eq!(factorial(4), 24);
} }
} }

View file

@ -942,10 +942,10 @@ dir = "18_iterators"
hint = """ hint = """
In an imperative language, you might write a `for` loop that updates a mutable In an imperative language, you might write a `for` loop that updates a mutable
variable. Or, you might write code utilizing recursion and a match clause. In variable. Or, you might write code utilizing recursion and a match clause. In
Rust you can take another functional approach, computing the factorial Rust, you can take another functional approach, computing the factorial
elegantly with ranges and iterators. elegantly with ranges and iterators.
Hint 2: Check out the `fold` and `rfold` methods!""" Check out the `fold` and `rfold` methods!"""
[[exercises]] [[exercises]]
name = "iterators5" name = "iterators5"

View file

@ -1 +1,71 @@
// Solutions will be available before the stable release. Thank you for testing the beta version 🥰 // 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);
}
}