Coin de Gamma
2 years ago
1 changed files with 38 additions and 0 deletions
@ -0,0 +1,38 @@
|
||||
type CZS = Vec<Option<u32>>; |
||||
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<u32> { |
||||
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); |
||||
} |
||||
} |
Loading…
Reference in new issue