diff --git a/014/main.rs b/014/main.rs new file mode 100644 index 0000000..a0cba3d --- /dev/null +++ b/014/main.rs @@ -0,0 +1,38 @@ +type CZS = Vec>; +struct Collatz { czs: CZS } + +impl Collatz { + pub fn new() -> Collatz { + let cl0 = Some(0); // for indexing + let cl1 = Some(1); + Collatz { czs: vec![cl0, cl1] } + } + pub fn compute(&mut self, n: usize) -> u32 { + match self.ensure_get(n) { + Some(cl) => cl, + None => { + //println!("compute {}", n); + let cl_prev = if n % 2 == 0 { + self.compute(n / 2) + } else { + self.compute(3 * n + 1) + }; + self.czs[n] = Some(cl_prev + 1); + cl_prev + 1 + } + } + } + pub fn ensure_get(&mut self, i: usize) -> Option { + while self.czs.len() <= i { self.czs.push(None); } + self.czs[i] + } +} + +fn main() { + let mut collatz = Collatz::new(); + + for k in 0..100000usize { + let clk = collatz.compute(k); + println!("{}: {}", k, clk); + } +}