剑指offer面试题9:斐波那契数列及其拓展青蛙跳台阶问题

菲波那切数列公式:

在这里插入图片描述
最简单的递归方法,但效率非常低下,面试官一般会再问你有没有优化的方法

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)的求得规律,即该层台阶为上一层台阶的跳法数的两倍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值