昨夜剁手了又,钱包说“干啥啥不行,花钱第一名,快去写码刷题!”^o^,所以我来三分钟速刷了这一题。(2021年3月5日)
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
题目分析:
做题三分钟,讲题我可得慢点儿哈~
这个题,一看,求各种可能结果的数量,立刻想到-->这要么是递归,要么是动态规划!
这题比较简单,递归就不会超时超空间
不会判断的码友,也不急,我们可以用倒推的办法发现规律。
现有一个青蛙,n个台阶,我们定义用f(n) 表示它有f(n)种跳法上来的。(为了好理解,给大家PS个青蛙跳台阶图)
那么,思考下,这个绿青蛙(在第n级台阶),会是从哪里跳来的呢?
(共有两种可能:
1--从第n-1级台阶,向上跳1个台阶,到达第n级台阶
2--从第n-2级台阶,向上跳2个台阶,到达第n级台阶
你说“还有别的可能么”,没了,因为青蛙只会跳1个台阶或跳2个台阶)
那么,f(n)种跳法等于到达n-1级台阶的跳法 + 到达n-2级台阶的跳法
再推一步(递归公式):
上面我们说啊,
n个台阶,它有f(n)种跳法上来的;
那么,把n换成n-1、换成n-2,大家还会表示的,对吧
n-1个台阶,它有f(n-1)种跳法上来的;
n-2个台阶,它有f(n-2)种跳法上来的;
那么,得到(递归公式),
f(n) = f(n-1) + f(n-2)
因为:[f(n)种跳法等于到达n-1级台阶的跳法 + 到达n-1级台阶的跳法]
计算f(1)、f(2)
因为有台阶,青蛙才可以跳,所以,台阶数一定是大于0的。
所以,套用递归公式f(n) = f(n-1) + f(n-2)时,要满足
n > 0
n - 1 > 0
n - 2 > 0
所以,n 要大于2。
我们需要计算下f(1)、f(2)的值,
看本文唯一的图哈。
从平地,向上跳1个台阶,到达第1级台阶
共1种跳法,f(1) = 1;
从平地,向上跳1个台阶,再向上跳1个台阶,到达第2级台阶
从平地,向上跳2个台阶,到达第2级台阶
共2种跳法,f(2) = 2;
完整递推公式
f(1) = 1 (n>0)
f(2) = 2 (n>0)
f(n) = f(n-1) + f(n-2) (n>2)
C++代码
最后,上C++代码
class Solution {
public:
int jumpFloor(int number) {
if(number > 0)/*因为有台阶,青蛙才可以跳,所以,台阶数一定是大于0的。*/
{
switch(number)
{
case 1:/*计算仅1个台阶时*/
{
return 1;
break;
}
case 2:/*计算仅2个台阶时*/
{
return 2;
break;
}
default:
{
return (jumpFloor(number - 1) + jumpFloor(number - 2));
}
}
}
else
{
return 0;
}
}
};