Skip to content

Commit f1877d7

Browse files
authored
Add memoized fibonacci (rust-lang#272)
1 parent 6c14e95 commit f1877d7

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

src/dynamic_programming/fibonacci.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/// Fibonacci via Dynamic Programming
2+
use std::collections::HashMap;
23

34
/// fibonacci(n) returns the nth fibonacci number
45
/// This function uses the definition of Fibonacci where:
@@ -94,11 +95,40 @@ fn _logarithmic_fibonacci(n: u32) -> (u128, u128) {
9495
}
9596
}
9697

98+
/// Memoized fibonacci.
99+
pub fn memoized_fibonacci(n: u32) -> u128 {
100+
let mut cache: HashMap<u32, u128> = HashMap::new();
101+
102+
_memoized_fibonacci(n, &mut cache)
103+
}
104+
105+
fn _memoized_fibonacci(n: u32, cache: &mut HashMap<u32, u128>) -> u128 {
106+
if n == 0 {
107+
return 0;
108+
}
109+
if n == 1 {
110+
return 1;
111+
}
112+
113+
let f = match cache.get(&n) {
114+
Some(f) => f,
115+
None => {
116+
let f1 = _memoized_fibonacci(n - 1, cache);
117+
let f2 = _memoized_fibonacci(n - 2, cache);
118+
cache.insert(n, f1 + f2);
119+
cache.get(&n).unwrap()
120+
}
121+
};
122+
123+
*f
124+
}
125+
97126
#[cfg(test)]
98127
mod tests {
99128
use super::classical_fibonacci;
100129
use super::fibonacci;
101130
use super::logarithmic_fibonacci;
131+
use super::memoized_fibonacci;
102132
use super::recursive_fibonacci;
103133

104134
#[test]
@@ -202,4 +232,22 @@ mod tests {
202232
assert_eq!(classical_fibonacci(101), fibonacci(100));
203233
assert_eq!(classical_fibonacci(185), fibonacci(184));
204234
}
235+
236+
#[test]
237+
fn test_memoized_fibonacci() {
238+
assert_eq!(memoized_fibonacci(0), 0);
239+
assert_eq!(memoized_fibonacci(1), 1);
240+
assert_eq!(memoized_fibonacci(2), 1);
241+
assert_eq!(memoized_fibonacci(3), 2);
242+
assert_eq!(memoized_fibonacci(4), 3);
243+
assert_eq!(memoized_fibonacci(5), 5);
244+
assert_eq!(memoized_fibonacci(10), 55);
245+
assert_eq!(memoized_fibonacci(20), 6765);
246+
assert_eq!(memoized_fibonacci(21), 10946);
247+
assert_eq!(memoized_fibonacci(100), 354224848179261915075);
248+
assert_eq!(
249+
memoized_fibonacci(184),
250+
127127879743834334146972278486287885163
251+
);
252+
}
205253
}

src/dynamic_programming/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ pub use self::egg_dropping::egg_drop;
1717
pub use self::fibonacci::classical_fibonacci;
1818
pub use self::fibonacci::fibonacci;
1919
pub use self::fibonacci::logarithmic_fibonacci;
20+
pub use self::fibonacci::memoized_fibonacci;
2021
pub use self::fibonacci::recursive_fibonacci;
2122
pub use self::is_subsequence::is_subsequence;
2223
pub use self::knapsack::knapsack;

0 commit comments

Comments
 (0)