rust-book/__non-book-expirements__/fibonacci/src/main.rs

53 lines
1.4 KiB
Rust

extern crate separator;
use separator::Separatable;
use std::io;
///! Calculate a number in the fibonnacci sequence,
///! using a lookup table for better worst-case performance.
///
/// Can calculate up to 186 using native unsigned 128 bit integers.
fn fibonacci(n: usize, table: &mut Vec<u128>) -> u128 {
match table.get(n) {
Some(x) => *x, // Vec<T>.get returns a Option with a reference to the value, so deref
None => {
let a = n - 1;
let b = n - 2;
let current = fibonacci(a, table) + fibonacci(b, table);
table.insert(n, current);
current
}
}
}
fn main() {
// The lookup table for previously calculated values
let mut table: Vec<u128> = vec![0, 1, 1, 2, 3, 5];
println!("Fibonacci calculator.");
println!("Any non-number will exit.");
loop {
println!("\nWhich index in the sequence to calculate?");
let mut index = String::new();
io::stdin().read_line(&mut index)
.expect("Failed to read line");
let index = match index.trim().parse() {
Ok(num) => num,
Err(_) => break, // Exit on non-number
};
let calculated = fibonacci(index, &mut table);
println!("Calculating number for index: {}", index);
println!("The Fibonnacci number at index: {} is {}", index, calculated.separated_string());
}
}