斐波那契数列中:
f(n)=0 (n=0)
f(n)=1 (n=1)
f(n)=f(n-1)+f(n-2) (n>1)
这个不在赘述。是一个效率很低下的解法。因为重复计算太多。
**时间复杂度为O(n)的解法** 这种方法只是避免了递归的重复计算 从下往上计算,根据f(0)和f(1)计算出f(2),再由f(1)和f(2)计算出f(3). 代码实现如下: public int Fibonacci(int n) {
int[] result={0,1};
if(n<2)
{
return result[n];
}
int fibNMinusOne=1;
int fibNMinusTwo=0;
int fib=0;
for(int i=2;i<=n;i++)
{
fib=fibNMinusOne+fibNMinusTwo;
fibNMinusTwo=fibNMinusOne;
fibNMinusOne=fib;
}
return fib;
}
**时间复杂度为O(logn)的解法,但是不够实用**
稍后补充
斐波那契数列的应用:
变态青蛙跳问题
一直青蛙一次可以跳上1级台阶,也可以跳上两级台阶......它可以跳上n级台阶,此时青蛙跳上n级台阶共有多少种跳法。
public static int JumpFloorII(int target) {
int[] f=new int[9999];
f[1]=1;
f[2]=2;
for(int i=3;i<=target;i++)
{
for(int j=1;j<i;j++)
{
f[i]+=f[j];
}
f[i]++;
}
return f[target];
}
f(3)可以由f(2)再跳一次 也可以由f(1)再跳一次 也可以直接跳3级
f(3)=f(1)+f(2)+1
f(4)可以由f(3)再跳一次 也可以由f(2)再跳一次 也可由f(1)再跳一次 也可以直接跳4级
f(4)=f(1)+f(2)+f(3)+1
............