factorial/
lib.rs

1pub fn factorial(n: u32) -> u32{
2
3    fn inner_factorial(n: u32, agg: u32) -> u32{
4        match n.checked_mul(agg) {
5            None => 0,
6            _ => match n { n if n >= 2 => inner_factorial(n-1,n*agg), _ => agg}
7        }
8    }
9
10    match n {
11        n if n ==1 || n==0 => 1,
12        n if n > 1 => inner_factorial(n, 1) ,
13        _ => 0
14    }
15}
16
17pub fn pascal(c: u32, r: u32) -> u32{
18
19    fn inner_checked_addition(a: u32, b: u32) -> u32 {
20        match a.checked_add(b){
21            Some(v) => v,
22            None => 0
23        }
24    }
25
26    match (c,r) {
27    (c,r) if c == 0 || c == r => 1,
28    (c,r) if c == r - 1 => inner_checked_addition(1 , pascal(c - 1 , r - 1)),
29     _ => match inner_checked_addition(pascal(c, r -1) , pascal(c - 1, r - 1)) { x  if x > 0 => x, _ => 0 }
30    }
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36    #[test]
37    fn test_factorial_small_positive_integers() {
38        assert_eq!(factorial(3), 6);
39        assert_eq!(factorial(5), 120);
40    }
41    #[test]
42    fn test_factorial_zero_and_one(){
43         assert_eq!(factorial(1), 1);
44         assert_eq!(factorial(0), 1);
45    }
46    #[test]
47    fn test_factorial_large_numbers(){
48        assert_eq!(factorial(u32::max_value()-1),0);
49    }
50
51    #[test]
52    fn test_pascal_small_positive_integers(){
53        assert_eq!(pascal(1,3),3);
54        assert_eq!(pascal(1,2),2);
55        assert_eq!(pascal(0,2),1);
56    }
57   
58    //Failed attempt at preventing overflow for large values in pascal triangle. TODO: Handle
59    //overflow gracefully
60    #[test]
61    fn test_pascal_large_numbers(){
62        assert_eq!(pascal(u32::max_value()/4,u32::max_value()/2),0);
63    }
64}