From 7ba7cf729752f1b1ff11a02fd8de6410aa448898 Mon Sep 17 00:00:00 2001 From: Federico Igne Date: Sat, 26 Dec 2020 15:52:33 +0000 Subject: [rust] Pascal's Triangle --- pascals-triangle/src/lib.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 pascals-triangle/src/lib.rs (limited to 'pascals-triangle/src/lib.rs') diff --git a/pascals-triangle/src/lib.rs b/pascals-triangle/src/lib.rs new file mode 100644 index 0000000..7b2145b --- /dev/null +++ b/pascals-triangle/src/lib.rs @@ -0,0 +1,34 @@ +#[derive(Debug)] +pub struct PascalsTriangle { + rows: Vec>, +} + +impl PascalsTriangle { + fn next_row(row: &[u32]) -> Vec { + 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> { + self.rows.clone() + } +} -- cgit v1.2.3