题目:
一只青蛙一次可以跳上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;
}
小结:
递归思路真伟大。