|
1 | 1 | /// Fibonacci via Dynamic Programming |
| 2 | +use std::collections::HashMap; |
2 | 3 |
|
3 | 4 | /// fibonacci(n) returns the nth fibonacci number |
4 | 5 | /// This function uses the definition of Fibonacci where: |
@@ -94,11 +95,40 @@ fn _logarithmic_fibonacci(n: u32) -> (u128, u128) { |
94 | 95 | } |
95 | 96 | } |
96 | 97 |
|
| 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 | + |
97 | 126 | #[cfg(test)] |
98 | 127 | mod tests { |
99 | 128 | use super::classical_fibonacci; |
100 | 129 | use super::fibonacci; |
101 | 130 | use super::logarithmic_fibonacci; |
| 131 | + use super::memoized_fibonacci; |
102 | 132 | use super::recursive_fibonacci; |
103 | 133 |
|
104 | 134 | #[test] |
@@ -202,4 +232,22 @@ mod tests { |
202 | 232 | assert_eq!(classical_fibonacci(101), fibonacci(100)); |
203 | 233 | assert_eq!(classical_fibonacci(185), fibonacci(184)); |
204 | 234 | } |
| 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 | + } |
205 | 253 | } |
0 commit comments