序
遇到了一个青蛙上台阶的算法问题 。
问
一只小青蛙 ,一次可以跳一级台阶 ,也可以跳两级台阶 ,问这只小青蛙跳上 n 级台阶总共有多少种跳法 ?
思考
不可变因素是青蛙一次可以跳一级台阶或者一次可以跳两级台阶 ,可变的因素是台阶有 n 级 。
分析 n 级台阶的可能性 。
No.1 : n = 1 ( 一共一级台阶 )
答案:小青蛙只有一只跳法 。
No.2 : n = 2 (一共两级台阶)
答案:青蛙有两种跳法 ,一级一级跳 ,二级跳 。
No.3 : n > 2
此时有 n 个台阶 ,假设用函数 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。
代码实现
for 循环
private long frogJumpSteps( 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;
}
递归实现(感觉使用递归比较符合分析的流程)
public long frogJumpSteps(int n){
if(n < 1){ //没有台阶 n = 0
return 0;
}
if(n == 1){ //一级台阶 n = 1
return 1;
}
if(n == 2){ //两级台阶 n = 2
return 2;
}
return frogJumpSteps(n-1) + frogJumpSteps(n-2); //n级台阶 : f(n-1)+f(n-2)种跳法
}