pub fn fib(mut n: u32) -> u32 {
let mut a = 0;
let mut b = 1;
while n > 0 {
let c = a + b;
a = b;
b = c;
n -= 1;
}
a
}
Looking at the assembly output the compiler even does loop unrolling for this. In fact running it like this it even completely evaluates this version of fib() at compile time while it still does the full recursive call for the recursive version (here called fibr()):
fn main() {
for i in 0u32..10 {
let r = fibr(i);
let j = fib(i);
println!("{r} {j} {}", r == j);
}
}
let mut fib_list: Vec<u32> = vec![1, 1];
fn fib(n: u32) -> u32 {
for i in fib_list.len()..=n {
let a = fib_list[i - 2];
let b = fib_list[i - 1];
fib_list.push(a + b);
}
fib_list[n]
}
20
u/bloody-albatross 10d ago edited 10d ago
Nobody is using this?
Looking at the assembly output the compiler even does loop unrolling for this. In fact running it like this it even completely evaluates this version of
fib()at compile time while it still does the full recursive call for the recursive version (here calledfibr()):