// 1052: Fibonacci Bottom-Up DP with O(1) Space
// Approach 1: Vec-based bottom-up DP
fn fib_vec(n: usize) -> u64 {
if n <= 1 {
return n as u64;
}
let mut dp = vec![0u64; n + 1];
dp[1] = 1;
for i in 2..=n {
dp[i] = dp[i - 1] + dp[i - 2];
}
dp[n]
}
// Approach 2: O(1) space โ two variables
fn fib_const(n: usize) -> u64 {
if n <= 1 {
return n as u64;
}
let (mut a, mut b) = (0u64, 1u64);
for _ in 2..=n {
let t = a + b;
a = b;
b = t;
}
b
}
// Approach 3: Iterator/fold approach
fn fib_fold(n: usize) -> u64 {
if n <= 1 {
return n as u64;
}
let (_, b) = (2..=n).fold((0u64, 1u64), |(a, b), _| (b, a + b));
b
}
fn main() {
for n in [0, 1, 5, 10, 20, 30] {
println!("fib({}) = {}", n, fib_const(n));
}
}
#[cfg(test)]
mod tests {
use super::*;
const CASES: &[(usize, u64)] = &[
(0, 0), (1, 1), (2, 1), (5, 5), (10, 55), (20, 6765), (30, 832040),
];
#[test]
fn test_fib_vec() {
for &(n, expected) in CASES {
assert_eq!(fib_vec(n), expected, "fib_vec({n})");
}
}
#[test]
fn test_fib_const() {
for &(n, expected) in CASES {
assert_eq!(fib_const(n), expected, "fib_const({n})");
}
}
#[test]
fn test_fib_fold() {
for &(n, expected) in CASES {
assert_eq!(fib_fold(n), expected, "fib_fold({n})");
}
}
}
(* 1052: Fibonacci Bottom-Up DP with O(1) Space *)
(* Approach 1: Array-based bottom-up DP *)
let fib_array n =
if n <= 1 then n
else begin
let dp = Array.make (n + 1) 0 in
dp.(1) <- 1;
for i = 2 to n do
dp.(i) <- dp.(i - 1) + dp.(i - 2)
done;
dp.(n)
end
(* Approach 2: O(1) space โ two variables *)
let fib_const n =
if n <= 1 then n
else begin
let a = ref 0 in
let b = ref 1 in
for _ = 2 to n do
let t = !a + !b in
a := !b;
b := t
done;
!b
end
(* Approach 3: Functional fold with tuple *)
let fib_fold n =
if n <= 1 then n
else
let (_, b) =
List.init (n - 1) Fun.id
|> List.fold_left (fun (a, b) _ -> (b, a + b)) (0, 1)
in
b
let () =
List.iter (fun (n, expected) ->
assert (fib_array n = expected);
assert (fib_const n = expected);
assert (fib_fold n = expected)
) [(0, 0); (1, 1); (2, 1); (5, 5); (10, 55); (20, 6765); (30, 832040)];
Printf.printf "โ All tests passed\n"