一、青蛙跳台阶不同难度的介绍
首先青蛙跳台阶大致分为三个难度模式,这个里边所谓的公式不要去背,建议将多项式列出来,自己化简就行了。下边一一介绍这三个版本:
1.初级版:
告诉给定的台阶数,并且题目交代:青蛙只能一次跳一个台阶或者青蛙跳两个台阶
。这个题我们在简单的列举之后会发现台阶的高度和青蛙的跳法是有规律的(和斐波那契数列很相似,只是换掉了第二项,构成次序列的思路与斐波那契数列完全一样)。
下边是具体的代码(内部含有详细的思路和化简说明)
// 1.简单的跳台阶:说给定一个n阶的台阶,青蛙一次只能挑一个或者两个,问有多少种跳法
// 结论:最后转换和斐波那契数列相似,局部变化了
// 列举:一个台阶:(1) 一种
// 两个台阶:(1,1),(2) 两种
// 三个台阶:(1,2),(2,1),(1,1,1) 三种
// 四个台阶:(2,2),(1,2,1),(1,1,2),(2,1,1),(1,1,1,1) 四种 ......
// 通过上边的列举我们可以看见,这就是跟斐波那契的思路一样了,只不过第二项发生了变化
// 后边值 = 前一项 + 前前一项,下边是初阶跳台阶的写法哈
public static int primaryJump(int n) {// 方法里边传的参数是台阶的数
// 斐波那契得用递归,简单
// 特殊情况处理
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
// 这里的第二项要处理一下,因为这里的2不是0项和1项的和,而斐波那契中就不用处理,
// 它满足那个关系
if (n == 2) {
return 2;
}
// 一般情况处理,递归处理
return primaryJump(n - 1) + primaryJump(n - 2);
}
2.中级版:
告诉台阶数了,这里变化的是青蛙能跳的台阶的数不在是1或者2,跳法而是从1~n阶
,从一次一个台阶到一次直接蹦完所有的台阶,直接登顶。这个题我们可以借鉴初级版的一些结论。
下边是具体代码的实现过程(内部含有详细解释和推导)
// 2.困难的青蛙跳台阶,说是给定n个台阶,这个青蛙可以一次可以跳1,2,3,4,5... n个台阶。
// 刚已经分析了,一次跳一阶,返回的是primaryJump(n - 1),两次是primaryJump(n - 2)
// 那么结论: n阶就是primaryJump(n - n)。然后把所有的每一次都递归的加起来即可
// 经过列举观察可发现: primaryJump(n) = 2*primaryJump(n - 1)
// 那么这里跳的台阶的跳法就是:(n - n) + (n - (n - 1)) + (n- (n - 2))....(n - 1)
// 对应的就是: (0) + (1) + (2) + .....(n - 1)
public static int difficultJump(int n) {
// 特殊情况的处理
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
// 一般情况的处理,带那个公式进行递归即可
return 2 * difficultJump(n - 1);
}
3.变态版:
在中级版的基础上进行了改造,给定的要上的台阶的最大高度和青蛙每一次能上的台阶数是未知的
。我们不知道到底是台阶最大高度大还是青蛙每次能跳的最大高度大。这里就要比较一下,具体情境具体处理即可。
下边是代码实现过程(内含有详细的注解和推导)
// 3.变态跳台阶:给定的台阶数和青蛙跳的最大的台阶数不一样。
// 题目要求:说一个青蛙能跳的台阶是1,2,3,4,....n,现在给定一个m级的台阶要青蛙跳,
// 有多少种跳法
// 分为两种情况:(1)要是给的台阶的高度m小于青蛙能跳的最大台阶数n,青蛙能从1阶跳到m阶
// (2)要是给定的台阶高度m大于等于能跳的最大台阶数n,青蛙能从1阶跳到n阶
// f(n) = f(n-1) + f(n-2) +..... + f(n-m);
// f(n-1) = f(n-2) + f(n-3) + .....+ f(n-m-1);
// 这里化简两个式子可得到一个关系式 f(n) = 2*f(n-1) - f(n-m-1);
// 下边是具体的代码操作。
public static int pervertedJump(int n,int m) {
// n表示的是青蛙能跳的最大台阶数,m表示的是给定的台阶的高度
// (1)台阶高度<最大能跳台阶数,能跳的是(1~m),注意里边要填的参数
if (m < n) {
return 2*pervertedJump(n - 1,m) + pervertedJump(n - m - 1,m);
}
// (2)台阶高度>=最大能跳台阶数,跳的是(1~n),注意里边要填的参数。
if (n <= 1) {
return 1;
} else {
return 2*pervertedJump(n - 1,n);
}
}