I want to implement a Fibonacci series along with caching already calculated results. I'm not sure that this approach is possible even in Rust, but this is the best I came up with. Here is the code:
use std::collections::HashMap;
pub fn fib_hash(n: u32) -> u64 {
let mut map: HashMap<u32, u64> = HashMap::new();
fn f(map: &HashMap<u32, u64>, n: u32) -> u64 {
let c = match map.get(&n) {
Some(&number) => number,
_ => 0,
};
if c != 0 {
return c;
}
let m = match n {
1 if n < 1 => 0,
1...2 => 1,
_ => f(&map, n - 1) + f(&map, n - 2),
};
map.insert(n, m);
m
}
f(&map, n)
}
The idea is to have a βglobalβ one HashMapthat can be reused. However, I assume that this is actually not possible, as we will have several volatile borrowers for the card. This is the error I get
Rust 2015
error[E0596]: cannot borrow immutable borrowed content '*map' as mutable
--> src/lib.rs:20:9
|
7 | fn f(map: &HashMap<u32, u64>, n: u32) -> u64 {
| ------------------ use '&mut HashMap<u32, u64>' here to make mutable
...
20 | map.insert(n, m);
| ^^^ cannot borrow as mutable
Rust 2018
error[E0596]: cannot borrow '*map' as mutable, as it is behind a '&' reference
--> src/lib.rs:20:9
|
7 | fn f(map: &HashMap<u32, u64>, n: u32) -> u64 {
| ------------------ help: consider changing this to be a mutable reference: '&mut std::collections::HashMap<u32, u64>'
...
20 | map.insert(n, m);
| ^^^ 'map' is a '&' reference, so the data it refers to cannot be borrowed as mutable
Can I use this approach in Rust? What would be the best solution to this problem?