1.递归解法
public class Fibo {
public static void main(String[] args) {
System.out.println(fib(10));
}
static int fib(int N){
if (N==0){return 0;}
if(N==1 || N==2){return 1;}
return fib(N-1)+fib(N-2);
}
}
2.带备忘录的递归解法
public class MemoFibo {
public static void main(String[] args) {
Memo memo = new Memo();
System.out.println(memo.fib(10));
}
}
class Memo{
int fib(int N){
if (N==0){return 0;}
int[] memo = new int[N+1];
return helper(memo,N);
}
int helper(int[] memo,int n){
if(n==1 || n==2){return 1;}
if (memo[n] != 0){return memo[n];}
memo[n] = helper(memo, n-1) + helper(memo, n-2);
return memo[n];
}
}
3.dp数组(自底向上的动态规划思路)解法
public class DpFibo {
public static void main(String[] args) {
Dp dp = new Dp();
DpTable dpTable =new DpTable();
System.out.println(dp.fib(10));
}
}
class Dp{
int fib(int n){
int[] dp = new int[n+1];
dp[0] = 0;
dp[1] = 1;
for(int i=2;i<=n;i++){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
}
4.优化空间复杂度为O(1)的自底向上解法
public class DpFibo {
public static void main(String[] args) {
Dp dp = new Dp();
DpTable dpTable =new DpTable();
System.out.println(dp.fib(10));
System.out.println("优化后===》");
System.out.println(dpTable.fib(10));
}
}
class Dp{
int fib(int n){
int[] dp = new int[n+1];
dp[0] = 0;
dp[1] = 1;
for(int i=2;i<=n;i++){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
}
class DpTable{
int fib(int N){
if (N==0){return 0;}
if(N==2 || N ==1){return 1;}
int prev =1,curr =1;
for (int i = 3; i <= N ; i++) {
int sum =prev +curr;
prev = curr;
curr = sum;
}
return curr;
}
}