pub fn nth_lucas(n: usize) -> u128 {
match n {
0 => 2u128,
1 => 1u128,
_ => nth_lucas(n - 1) + nth_lucas(n - 2),
}
}
pub fn nth_lucas_memoized(n: usize) -> u128 {
let mut memoizer = vec![2, 1];
nth_lucas_with_memoizer(n, &mut memoizer)
}
fn nth_lucas_with_memoizer(n: usize, memoizer: &mut Vec<u128>) -> u128 {
if n < memoizer.len() {
memoizer[n].clone()
} else {
let lth_lucas = nth_lucas_with_memoizer(n - 1, memoizer);
let mth_lucas = nth_lucas_with_memoizer(n - 2, memoizer);
let nth_lucas = lth_lucas + mth_lucas;
memoizer.push(nth_lucas);
memoizer[n].clone()
}
}
pub fn lucas_sequence(n: usize) -> Vec<u128> {
if n == 0 {
vec![]
} else if n == 1 {
vec![2]
} else if n == 2 {
vec![2, 1]
} else {
let mut sequence = vec![2, 1];
(2..n).for_each(|i| sequence.push(sequence[i - 1] + sequence[i - 2]));
sequence
}
}