1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
pub fn factorial(n: u32) -> u32{

    fn inner_factorial(n: u32, agg: u32) -> u32{
        match n.checked_mul(agg) {
            None => 0,
            _ => match n { n if n >= 2 => inner_factorial(n-1,n*agg), _ => agg}
        }
    }

    match n {
        n if n ==1 || n==0 => 1,
        n if n > 1 => inner_factorial(n, 1) ,
        _ => 0
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn test_factorial_small_positive_integers() {
        assert_eq!(factorial(3), 6);
        assert_eq!(factorial(5), 120);
    }
    #[test]
    fn test_factorial_zero_and_one(){
        assert_eq!(factorial(1), 1);                                                                                                                                                                    assert_eq!(factorial(0), 1);
    }
    #[test]
    fn test_large_numbers(){
        assert_eq!(factorial(u32::max_value()-1),0);
    }
}