菲波那切数列公式:
最简单的递归方法,但效率非常低下,面试官一般会再问你有没有优化的方法
public long Fibonacci(int n){
if(n==0)return 0;
if(n==1)return 1;
return Fibonacci(n-1)+Fibonacci(n-2);
}
优化之后的方法,避免重复计算已经计算过的值
public long Fibonacci(int n) {
long []a= {0,1};
if(n<2) {
return a[n];
}
long f1=0;
long f2=1;
long fin=0;
for(int i=2;i<=n;i++) {
fin=f1+f2;
f1=f2;
f2=fin;
}
return fin;
}
变种问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级台阶总共有多少种跳法。
分析:如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,有两种跳法:一次跳2阶,或者一次跳1阶台阶,两次跳完。
我们把n级台阶时的跳法看成是n的函数f(n)。当n>2时,第一次跳就有两种不同的选择,一是第一次只跳一级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即f(n-1);二是第一次跳两级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即f(n-2)。因此不难看出这就是典型的斐波那契数列问题了。
变种题目:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形,请问用8个2*1的小矩形去无重复地覆盖一个2*8的大矩形,总共有多少种方法?
分析:我们把2*8的覆盖方法记为f(8),用2*1的小矩形去覆盖大矩形最左边时有两个选择,横着放或者竖着放,当竖着放的时候,右边还剩下2*7的区域,此时为f(7);若横着放在左上角的时候,左下角也要横着放一个2*1的小矩形,而在右边还剩下2*6的区域,即f(6);因此f(8)=f(7)+f(6)。此时可看出这仍是一个斐波那契数列问题。
扩展问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶······它也可以跳上n级台阶,此时该青蛙跳上一个n级台阶总共有多少种跳法?
分析:若为1级台阶,则f(1)=1=2^0;
这儿令f(1)=f(0)=1;
若为2级台阶,则f(2)=2=f(0)+f(1)=f(1)*2=2^1;
若为3级台阶,则f(3)=4=f(0)+f(1)+f(2)=f(2)*2=2^2;
若为4级台阶,则f(4)=8=f(0)+f(1)+f(2)+f(3)=f(3)*2=2^3;
``````
则n级台阶,则f(n)=f(0)+f(1)+f(2)+f(3)+···+f(n-1)=f(n-1)*2=2^(n-1);
数学归纳法得出了f(n)的求得规律,即该层台阶为上一层台阶的跳法数的两倍。