难度
思路
递归
- 斐波那契数列的递推式本身就符合
递归定义,因此可直接写出。 - 问题
- 简单的递归方式显然不是此问题的最优解,因为它会重复计算。

- 而且时间复杂度很高,指数级。
| 时间复杂度 | O(2**)** | | —- | —- | | 空间复杂度 | O(n) |private static int fib_1(int n) {return n < 2 ? 1 : fib_1(n-1) + fib_2(n - 2);}
动态规划
动态规划并非此问题的最优解,但是我们能用动态规划写出就算是最优解。public static int fib_2(int n) {if (n == 0) return 0;if (n == 1) return 1;int[] dp = new int[n + 1];dp[0] = 0;dp[1] = 1;for (int i = 1; i < n; i++) {dp[i+1] = dp[i] + dp[i-1];dp[i+1] %= 1000000007;}return dp[n];}
| 时间复杂度 | O(n) | | —- | —- | | 空间复杂度 | O(n) |
总结
- 需要加深对
动态规划的理解,现在虽然能根据题目写出动态规划递推式,但是还是知其然不知其所以然,往后需要加深原理的理解。 斐波那契数列也包含了数据之美,详戳
