Description
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
Solution1:递归
首先如果只有1个台阶,那青蛙只有一种跳法;如果有两个台阶,青蛙有两种跳法:一个台阶一个台阶跳;一次跳两个台阶;如果有n(n > 2)个台阶,假设用函数f(n)表示总共跳的方法数,这时青蛙在第一次有两种选择:选择跳一个台阶,则剩下n-1个台阶故剩下的台阶有f(n-1)种跳法;选择跳两个台阶,则剩下n-2个台阶故剩下的台阶有f(n-2)种跳法。
从后往前递推,完成n级台阶的最后一次动作可能是跳1级,可能是跳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)种跳法
}
Solution2
实现方法二利用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;
}
递归相关
一个递归算法必须包括 :终止条件和递归部分
Appendix
1.问题来源:微信公众号~数据结构与算法【来自:一个不甘平凡的码农(微信号:Web_Coding)】
2.转自:程序猿li