Skip to content

Commit c656dc0

Browse files
committed
Add recursion.rs
1 parent b2acb65 commit c656dc0

File tree

3 files changed

+100
-16
lines changed

3 files changed

+100
-16
lines changed

labocédai/src/lib.rs

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
pub mod simple_challenges;
2+
pub mod recursion;
23

34
#[cfg(test)]
45
mod tests {
@@ -47,11 +48,60 @@ mod tests {
4748

4849
#[test]
4950
fn test_max_n_width_sub_array() {
50-
assert_eq!(max_n_width_sub_array_sum(&[1, 2, 5, 2, 8, 1, 5], 2), Some(10));
51-
assert_eq!(max_n_width_sub_array_sum(&[1, 2, 5, 2, 8, 1, 5], 4), Some(17));
51+
assert_eq!(
52+
max_n_width_sub_array_sum(&[1, 2, 5, 2, 8, 1, 5], 2),
53+
Some(10)
54+
);
55+
assert_eq!(
56+
max_n_width_sub_array_sum(&[1, 2, 5, 2, 8, 1, 5], 4),
57+
Some(17)
58+
);
5259
assert_eq!(max_n_width_sub_array_sum(&[4, 2, 1, 6], 1), Some(6));
5360
assert_eq!(max_n_width_sub_array_sum(&[4, 2, 1, 6, 2], 4), Some(13));
5461
assert_eq!(max_n_width_sub_array_sum(&[], 4), None);
5562
}
5663
}
64+
65+
mod recursion {
66+
use crate::recursion::*;
67+
#[test]
68+
fn test_power() {
69+
assert_eq!(power(2, 2), 2_usize.pow(2));
70+
assert_eq!(power(6, 1), 6_usize.pow(1));
71+
assert_eq!(power(2, 8), 2_usize.pow(8));
72+
assert_eq!(power(0, 2), 0_usize.pow(2));
73+
assert_eq!(power(2, 0), 2_usize.pow(0));
74+
}
75+
76+
#[test]
77+
fn test_factorial() {
78+
assert_eq!(factorial(3), 3 * 2 * 1);
79+
assert_eq!(factorial(5), 5 * 4 * 3 * 2 * 1);
80+
assert_eq!(factorial(1), 1);
81+
assert_eq!(factorial(0), 1);
82+
}
83+
84+
#[test]
85+
fn test_product_of_nums() {
86+
assert_eq!(product_of_nums(&[1, 2, 3]), Some(1 * 2 * 3));
87+
assert_eq!(product_of_nums(&[1, -2, 3]), Some(1 * -2 * 3));
88+
assert_eq!(product_of_nums(&[1, -2, 0]), Some(1 * -2 * 0));
89+
assert_eq!(product_of_nums(&[]), None);
90+
}
91+
92+
#[test]
93+
fn test_sum_up_to() {
94+
assert_eq!(sum_up_to(5), 0 + 1 + 2 + 3 + 4 + 5);
95+
assert_eq!(sum_up_to(1), 0 + 1);
96+
assert_eq!(sum_up_to(0), 0);
97+
}
98+
99+
#[test]
100+
fn test_fibonacci() {
101+
assert_eq!(fibonacci(4), 3);
102+
assert_eq!(fibonacci(10), 55);
103+
assert_eq!(fibonacci(28), 317811);
104+
assert_eq!(fibonacci(35), 9227465);
105+
}
106+
}
57107
}

labocédai/src/recursion.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
pub fn power(base: usize, exponent: usize) -> usize {
2+
if exponent == 0 {
3+
return 1;
4+
}
5+
base * power(base, exponent - 1)
6+
}
7+
8+
pub fn factorial(num: usize) -> usize {
9+
if num <= 1 {
10+
return 1;
11+
}
12+
num * factorial(num - 1)
13+
}
14+
15+
pub fn product_of_nums(nums: &[isize]) -> Option<isize> {
16+
if nums.len() == 0 {
17+
return None;
18+
}
19+
let next_product = product_of_nums(&nums[1..]);
20+
if let Some(product) = next_product {
21+
return Some(nums[0] * product);
22+
}
23+
Some(nums[0])
24+
}
25+
26+
pub fn sum_up_to(num: usize) -> usize {
27+
if num == 0 {
28+
return 0;
29+
}
30+
num + sum_up_to(num - 1)
31+
}
32+
33+
pub fn fibonacci(n: usize) -> usize {
34+
/* returns the nth number in the fibonacci sequence */
35+
if n == 1 || n == 2 {
36+
return 1;
37+
}
38+
fibonacci(n - 1) + fibonacci(n - 2)
39+
}

labocédai/src/simple_challenges.rs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
pub fn sum_up_to(num: usize) -> usize {
32
(0..=num).into_iter().fold(0, |acc, n| acc + n)
43
}
@@ -72,21 +71,17 @@ pub fn max_n_width_sub_array_sum(nums: &[isize], n: usize) -> Option<isize> {
7271
if nums.len() < n {
7372
return None;
7473
}
75-
let mut max_sum: Option<isize> = None;
76-
let mut j = n;
74+
let mut sum = sum_nums(&nums[0..n]);
75+
let mut max_sum = sum;
7776
for (i, _) in nums.iter().enumerate() {
78-
if i + n <= nums.len() {
79-
let sum = sum_nums(&nums[i..j]);
80-
match max_sum {
81-
Some(s) => {
82-
if sum > s {
83-
max_sum = Some(sum);
84-
}
85-
},
86-
None => max_sum = Some(sum)
77+
if i > 0 && i + n <= nums.len() {
78+
sum -= nums[i - 1];
79+
sum += nums[i + n - 1];
80+
81+
if sum > max_sum {
82+
max_sum = sum
8783
}
88-
j += 1;
8984
}
9085
}
91-
max_sum
86+
Some(max_sum)
9287
}

0 commit comments

Comments
 (0)