1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
use num::{BigInt, One};

pub fn catalan_recursive(n: usize) -> BigInt {
    match n {
        0 => BigInt::one(),
        _ => catalan_recursive(n - 1) * 2 * (2 * n - 1) / (n + 1),
    }
}

pub fn catalan_number(n: usize) -> BigInt {
    let mut m = Vec::with_capacity(n);
    m.push(BigInt::one());
    for i in 1..=n {
        let new = m.last().unwrap() * 2 * (2 * i - 1) / (i + 1);
        m.push(new);
    }
    m.pop().unwrap()
}