|
1 | 1 | #include "../exercise.h" |
2 | 2 |
|
3 | | -// TODO: 改正函数实现,实现正确的缓存优化斐波那契计算 |
4 | | -// THINk: 这个函数是一个纯函数(pure function)吗? |
5 | | -// READ: 纯函数 <https://zh.wikipedia.org/wiki/%E7%BA%AF%E5%87%BD%E6%95%B0> |
6 | | -static unsigned long long fibonacci(int i) { |
7 | | - // TODO: 为缓存设置正确的初始值 |
8 | | - static unsigned long long cache[96], cached; |
9 | | - // TODO: 设置正确的循环条件 |
10 | | - for (; false; ++cached) { |
11 | | - cache[cached] = cache[cached - 1] + cache[cached - 2]; |
| 3 | +// READ: 数组 <https://zh.cppreference.com/w/cpp/language/array> |
| 4 | + |
| 5 | +unsigned long long arr[90]{0, 1}; |
| 6 | +unsigned long long fibonacci(int i) { |
| 7 | + switch (i) { |
| 8 | + case 0: |
| 9 | + return 0; |
| 10 | + case 1: |
| 11 | + return 1; |
| 12 | + default: |
| 13 | + return arr[i] != 0 ? arr[i] : (arr[i] = fibonacci(i - 1) + fibonacci(i - 2)); |
12 | 14 | } |
13 | | - return cache[i]; |
14 | 15 | } |
15 | 16 |
|
16 | | -// ---- 不要修改以下代码 ---- |
17 | 17 | int main(int argc, char **argv) { |
18 | | - ASSERT(fibonacci(0) == 0, "fibonacci(0) should be 0"); |
19 | | - ASSERT(fibonacci(1) == 1, "fibonacci(1) should be 1"); |
| 18 | + // TODO: 为此 ASSERT 填写正确的值 |
| 19 | + ASSERT(sizeof(arr) == sizeof(unsigned long long) * 90, "sizeof array is size of all its elements"); |
| 20 | + // ---- 不要修改以下代码 ---- |
20 | 21 | ASSERT(fibonacci(2) == 1, "fibonacci(2) should be 1"); |
21 | | - ASSERT(fibonacci(3) == 2, "fibonacci(3) should be 2"); |
22 | | - ASSERT(fibonacci(10) == 55, "fibonacci(10) should be 55"); |
23 | | - |
24 | | - auto fib90 = fibonacci(90); |
25 | | - std::cout << "fibonacci(90) = " << fib90 << std::endl; |
26 | | - ASSERT(fib90 == 2880067194370816120, "fibonacci(90) should be 2880067194370816120"); |
| 22 | + ASSERT(fibonacci(20) == 6765, "fibonacci(20) should be 6765"); |
| 23 | + ASSERT(fibonacci(80) == 23416728348467685, "fibonacci(80) should be 23416728348467685"); |
27 | 24 | return 0; |
28 | 25 | } |
0 commit comments