法1 : recursion. O(pow(2, n))
public long FibRecursion(int n){
if(n < 2){
return n;
}
return FibRecursion(n - 2) + FibRecursion(n - 1);
}
法2:iteration. O(n)
public long FibIteration(int n ){
if(n < 2){
return n;
}
long a = 0;
long b = 1;
for(int i = 2; i <= n; i++){
long temp = b;
b += a;
a = temp;
}
return b;
}
法3: DP , O(n)
public long FibDP(int n, long[] dp){
if(n < 2){
return n;
}
if(dp[n] != 0)
return dp[n];
dp[n] = FibDP(n - 1, dp) + FibDP(n - 2, dp);
return dp[n];
}
法4:equation: log(n) a=f((n+1)/2) ;b=f((n+1)/2-1) ; if n is odd f(n)=a*a+b*b; if n is even f(n)=a*a+2*a*b;
public long FibEquation(int n) {
if (n < 2) {
return n;
}
long a = FibEquation((n + 1) / 2);
long b = FibEquation((n + 1) / 2 - 1);
if (n % 2 == 1) {
return a * a + b * b;
}
return a * a + 2 * a * b;
}