// 斐波那契数
Fibonacci 数列 是最典型的让我们了解递归算法的例子。
递归核心:
1. 递归关系表达式
2. 递归终止条件
- 直观的递归,调用自身
很多次重复计算,不提倡。
class Solution {
public int fib(int N) {
if (N == 0) return 0;
if (N == 1) return 1;
return fib(N-1)+fib(N-2);
}
}
- 递归 + memo (自顶向下迭代)
分析可知具有重复子结构,将计算结果保存在一个数组memo里面,减少重复计算,节约时间。
class Solution {
public int[] memo = new int[31];
// private Integer[] memo = new Integer[31];
public int fib(int N) {
if (N < 2) {
return N;
}
for (int i = 0; i< 31;i ++){
memo[i] = -1;
}
memo[0] = 0;
memo[1] = 1;
return helper(N);
}
public int helper(int N){
if (memo[N] == -1){
// if (memo[N] == null){ //memo是包装类Integer定义的
memo[N] = helper(N-1) + helper(N-2);
}
return memo[N];
}
}
- 使用动态规则(Dynamic Programming)
(自底向上迭代)
class Solution {
public int fib(int N) {
if (N<=1) return N;
return helper(N);
}
public int helper(int N){
int[] memo = new int[N+1];
memo[0] = 0;
memo[1] = 1;
for (int i = 2; i <= N; i++){
memo[i] = memo[i-1] + memo[i-2];
}
return memo[N];
}
}
学习开心
精诚所至,金石为开。