青蛙上台阶问题(Java)

题目:

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思想:

首先如果只有1个台阶,那青蛙只有一种跳法;如果有两个台阶,青蛙有两种跳法:一个台阶一个台阶跳;一次跳两个台阶;如果有n(n > 2)个台阶,假设用函数f(n)表示总共跳的方法数,这时青蛙在第一次有两种选择:选择跳一个台阶,则剩下n-1个台阶故剩下的台阶有f(n-1)种跳法;选择跳两个台阶,则剩下n-2个台阶故剩下的台阶有f(n-2)种跳法。

故f(n)= f(n-1) + f(n-2);n=1时f(n) = 1;n = 2时f(n)= 2;于是可以看到这个题目是明显的递归。

实现方法一递归(不推荐):

//基于递归实现
public long jumpStep(int n){
	if(n < 1){ //没有台阶返回0
		return 0;
	}
	if(n == 1){ //一个台阶一种跳法
		return 1;
	}
	if(n == 2){ //两个台阶两种跳法
		return 2;
	}
	return jumpStep(n-1) + jumpStep(n-2); //n个台阶f(n-1)+f(n-2)种跳法
}

实现方法二利用For循环(推荐):

//基于for循环实现
public long jumpStepByFor(int n){
	int result[] = {0, 1, 2};
	if(n < 3){
		return result[n];
	}
	long jumpCount1 = 1;
	long jumpCount2 = 2;
	long jumpCountn = 0;
	for (int i = 3; i <= n; ++i) {
		jumpCountn = jumpCount1 + jumpCount2;
		jumpCount1 = jumpCount2;
		jumpCount2 = jumpCountn;
	}
	return jumpCountn;
}

拓展:

题目:

一只青蛙一次可以跳1级台阶,一次也可以跳2级台阶.......它也可以一次跳上n级台阶,此时青蛙跳上一个n级台阶总共有多少种跳法。

思路:

首先还是假设:如果只有1个台阶,青蛙只有一种跳法。如果有2个台阶,青蛙有两种跳法:一个台阶一个台阶跳;一次跳两个台阶。如果有n个台阶:青蛙第一次选择跳一个台阶,剩下n-1个台阶有f(n-1)种跳法;青蛙第一次选择跳两个台阶,剩下n-2个台阶有f(n-2)种跳法;青蛙第一次选择3个台阶,剩下n-3个台阶有f(n-3)种跳法.......,青蛙第一次选择跳n-1个台阶,剩下1个台阶剩下一种跳法;青蛙第一次选择跳n个台阶,没有剩下台阶结束。在面对n-1个台阶时,青蛙还是像n个台阶那样跳的话。

故:

f(0) = 0;

f(1) = 1;

f(2) = 2;

f(n) = f(n-1) + f(n-2) +f(n-3) + .....+f(2) + f(1) + f(0);(一式)

f(n-1) = f(n-2) + f(n-3) + .... +f(2) + f(1) + f(0);(二式)

一式减去二式:f(n) = f(n-1) * 2;故又是明显的递归。

利用递归实现(不推荐):

public long jump(int n){
	if(n == 0){ //没有台阶
		return 0;
	}
	if(n == 1){ //一个台阶
		return 1;
	}
	if(n == 2){ //两个台阶
		return 2;
	}
	return 2*jump(n-1); //n个台阶
}

利用For循环实现(推荐):

public long jumpByFor(int n){
	int result[] = {0, 1, 2};
	if(n < 3){
		return result[n];
	}
	long jumpCount1 = 2;
	long jumpCountn = 0;
	for (int i = 3; i <= n; i++) {
		jumpCountn = 2 * jumpCount1;
		jumpCount1 = jumpCountn;
	}
	return jumpCountn;
}

小结:

递归思路真伟大。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值