aboutsummaryrefslogtreecommitdiff
path: root/rust/pascals-triangle/src/lib.rs
blob: 7b2145be163006e25bb5a83e9762bfaa4923129c (plain) (blame)
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
34
#[derive(Debug)]
pub struct PascalsTriangle {
    rows: Vec<Vec<u32>>,
}

impl PascalsTriangle {
    fn next_row(row: &[u32]) -> Vec<u32> {
        let mut next = Vec::new();
        let last = row.iter().fold(0, |p, n| {
            next.push(p + n);
            *n
        });
        next.push(last);
        next
    }
}

impl PascalsTriangle {
    pub fn new(row_count: u32) -> Self {
        let mut rows = Vec::new();
        if row_count > 0 {
            rows.push(vec![1]);
            (1..row_count).for_each(|i| {
                let irow = Self::next_row(&rows[(i as usize) - 1]);
                rows.push(irow);
            })
        }
        PascalsTriangle { rows }
    }

    pub fn rows(&self) -> Vec<Vec<u32>> {
        self.rows.clone()
    }
}