题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
时间限制
:1秒 空间限制:32768K 热度指数:435100
本题提示:
递归
解题思路
:如果这道题没有提示,或许还要想不少时间,然是给了递归的提示,我们的思路就会清晰很多,使用递归去分解问题便是本题的解题关键!但是也没有那么简单……要是没有见过类似的题目,面试那点时间估计要想出来还是挺难的。
假设
: 青蛙每一次跳跃有两种方案:一次跳一个台阶,设为
方案A,
一次跳两个台阶,设为
方案B。
假设跳上n个台阶青蛙有F种跳法,记为F(n)。
1. 对于n=1,即只有一个台阶时,只有1种跳法;
2. 对于n=2,有2种跳法:一次跳两个台阶或者两次跳一个台阶;
3. 对于n >=3时, 有两种情况: (1)青蛙是最后一跳是一个台阶 (即确定最后一跳是方案A),那此时的F(n) = F(n – 1); 也就是说在确定最后一跳是方案A的跳法了,那么n阶的跳法其实是等于前面n-1阶的跳法。
(2)青蛙最后一跳是两个台阶(即确定最后一跳为方案B),此时F(n) = F(n – 2);也就是说在确定最后一跳是方案B的跳法了,那么n阶的跳法其实是等于前面n-2阶的跳法。
(3)对于n阶台阶,青蛙总共的跳法F(n) = F(n – 1) + F(n – 2); (这里会有很多人转不过弯来,需要好好想想)
(4)好了,公式一推出来就很明显了,这就是著名的斐波那契数列的递推式,实现方法有递归实现和循环实现两种,笔者在上一篇都已经说过了,如果不清楚的朋友请看
上一篇
;
代码如下:
public class Solution {
public int JumpFloor(int target) {
if(target <=0) {
return 1;
}if(target == 1) {
return 1;
}else if (target == 2) {
return 2;
}else {
return this.JumpFloor(target - 1) + this.JumpFloor(target - 2);
}
}
}