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 #[test]
61 fn test_pascal_large_numbers(){
62 assert_eq!(pascal(u32::max_value()/4,u32::max_value()/2),0);
63 }
64}