summaryrefslogtreecommitdiff
path: root/rustlings/solutions/18_iterators/iterators4.rs
diff options
context:
space:
mode:
authorHunter Kvalevog <hunter@kvog.sh>2026-09-27 17:28:34 -0500
committerHunter Kvalevog <hunter@kvog.sh>2026-09-27 17:28:34 -0500
commit67fb6c0eb507965836201551f90c7d637bf6cee0 (patch)
tree59e405f7f98a0451d3a9051c2e2ed03dc3585dfa /rustlings/solutions/18_iterators/iterators4.rs
parent54731f0fc0b0fde18438853c0a8abaa968edb57a (diff)
rustlings: complete 18
Diffstat (limited to 'rustlings/solutions/18_iterators/iterators4.rs')
-rw-r--r--rustlings/solutions/18_iterators/iterators4.rs72
1 files changed, 70 insertions, 2 deletions
diff --git a/rustlings/solutions/18_iterators/iterators4.rs b/rustlings/solutions/18_iterators/iterators4.rs
index dcf2377..4168835 100644
--- a/rustlings/solutions/18_iterators/iterators4.rs
+++ b/rustlings/solutions/18_iterators/iterators4.rs
@@ -1,4 +1,72 @@
+// 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…
+ #[allow(clippy::unnecessary_fold)]
+ (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() {
- // DON'T EDIT THIS SOLUTION FILE!
- // It will be automatically filled after you finish the exercise.
+ // 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);
+ }
}