青蛙跳台阶,青蛙变态跳台阶问题(Java数据的递归,斐波那契数列)
1. 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
先从题目来假设分析,青蛙跳一个台阶有一种跳法。 也就是F(1)=1;青蛙跳两个台阶也就是有两种方法。直接跳2或者是 1 1 的跳。那么跳三个台阶就是有3种,分别为1 1 1 一种,或者2 1又或者1 2。我们可以以此先来找出规律在分析:
1 1
2 2
3 (111 1 2 2 1) 3
4 (1111 1 1 2 .1 2 1. 2 1 1 2 2 ) 5
5 (1111 1112 1121 1211 2111 221 212 122 )8
6 (111111. 【11112 5】【1122 1212 2112 2121 2211 1221 】222 )13
从三开始斐波那契数列
也就是可看出有f(n)=f(n-1)+f(n-2)这样的规律, 很简单的想一下,就是跳上N台阶的跳法个数 就是跳上N-1个台阶的跳法个数加上 跳上N-2的的跳法个数。那么这样的规律是为什么呢?解释一下这个的原因就是,青蛙一次只能跳一个台阶或者两个台阶,那么跳上该台阶的跳法就是从前一个台阶跳1跳上该台阶或者是从前前一个台阶跳2跳上该台阶。那么意思就很明确了。有多少种跳法跳到前一个台阶就有多少种跳法跳到该台阶。有多少种跳法跳到前前一个台阶就有多少种跳法跳到该台阶。那么跳到该台阶的跳法个数就是跳到前一个台阶的跳法个数加上后一个台阶的跳法个数。
代数解释下,青蛙跳到7台阶的跳法个数:F(7)=F(6)+F(5);
青蛙有多少种跳法跳到F6就有多少种跳法跳到F7 青蛙有多少种跳法跳到F5就有多少种跳法跳到F7.
则青蛙跳到F7的跳法就是跳到F6的跳法加上跳到F5的跳法。
代码实现:
public class Solution {
public int JumpFloor(int target) {
if(target <= 0){
return -1;
}
if(target == 1){
return 1;
}
if(target == 2){
return 2;
}
else{
return JumpFloor(target -1)+JumpFloor(target-2);
}
}
}
2.一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
从问题来看和青蛙跳台阶的不同就是该题多了一个一次可以跳n级的跳法次数。
分析青蛙跳到一个台阶有 1种跳法。青蛙跳到2层台阶有1 1 ,2两种跳法。那么三层的时候多了一个一次可以跳三层的跳法也就是1 1 1 , 1 2 , 2 1, 3共有四种跳法。
个人觉得先分析再看:
分析:
一共有n级台阶 那么就有n种跳法:跳1阶,跳2阶…跳n阶;
f(1)=1
f(2)=f(1)+f(2); / / f(1)一次跳一阶的跳法次数+f(2) 一次跳2阶的跳法次数
f(2)=f(1) +1 //这里f(2)是一次跳两级 也就是只有一个跳法,所以为 1 == ————**以下同理**
f(3)=f(1)+f(2)+f(3).
f(3)=f(1)+f(2)+1.
…
f(n)=f(1)+f(2)+…+f(n-1)+1;
那么以上的结论是没问题的:也就可以得出,
f(n-1)=f(1)+f(2)+…+f(n-2)+1
则可以看出!!!
f(n)=f(n-1)+f(n-1)
f(n)=2*f(n-1)
代码实现:
public class Solution {
public int JumpFloorII(int target) {
if(target <=0){
return 0;
}else if(target ==1){
return 1;
}else {
return 2 * JumpFloorII(target - 1);
}
}
}
规律分析:
ps:还是找原理简单,这种很麻烦且很不合适。
1 1】1
2 11 2 】2
3 111 12 21 3】4
4【1111 112 121 211 22 13 31 4】 8
5【11111 1112 1121 1211 2111 221 122 212 311 113 131 32 23 41 14 5】16