青蛙跳台阶
问题描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
注:此处的跳n级台阶,是指当共有三级台阶(111,12,21,3)
思路历程
-
刚开始,我把题目想岔了,我以为这个题目中的青蛙是永远从第一级台阶开始起跳,于是我写出了这样的算法:
class Solution { public: int jumpFloorII(int number) { int sum=0; for(int i = 0;i<=number;i++) sum++; return sum; } };
汗颜,回来兜圈子回来后发现,这写的是个啥啊(自我鄙视一秒钟)
- 后来,发现了它的跳台阶的实质,我又想到了先找找青蛙跳台阶的规律吧。然后发现:
台阶数 方案 方案总数
1 1 共计1
2 11,2 共计2
3 111,12,21,3 共计4
4 1111,121,112,13,22,211,31,4 共计8
5 11111,1211,1121,1112,122,131,113,14,2111,212,221,23,311,32,41,5
共计16
6 111111,11112,11121,11211,12111,1122,1212,1221,123,1311,1131,1113,132,141,114,15
21111,2211,2121,2112,222,231,213,24
3111,312,321,33
411,42
51,
6 共计32
······························
emmm,好像是2^(n-1)的关系,,,,
但是仔细一想,当有1级台阶的时候,只有跳完这种情况,也就是f(1)=1
当有2级台阶的时候,要么都跳,要么只跳一级台阶,挑礼物一级台阶,又回到了只有一级台阶的情况
也就是说f(2)=f(1)+1=2*f(1)
而当有3级台阶的时候,那么第一次就有了三种情况,要么跳一级回到f(2)的情况,要么跳两级回到f(1)的情况,要么一次性跳完,也就是说f(3)=f(2)+f(1)+1=2*f(2)
当有第四级台阶的时候,那么第一次起跳就有了四种情况,跳一级、两级、三级或四级,此时跳第二次分别对应还有三级台阶的情况,还有两级台阶的情况以及还有一级台阶的情况,也就是说f(4)=f(3)+f(2)+f(1)+1=2*f(3)
……
以此类推,f(n)=2*f(n-1)
所以说,这完全是一道数学的递推公式题目啊,我纠结了那么久都在想些什么呀(嗐)
因此可以用递归的方式来求解这道题:
c语言:
class Solution {
public:
int jumpFloorII(int number) {
if(number==1)
return 1;
return 2*jumpFloorII(number-1);
}
};
此处的代码只有核心函数的部分涉及了算法的相关知识,主函数就没有详细贴出来
本来应该用JS在写一个的,但是JS我才学到变量。后面补上。
但是我看到一些大牛说,这是一道可以递归,记忆化递归,动态规划,递推思想的题目,由于我对动态递归不太熟悉所以我只用了递归的方式去做这道题。后面有时间再说这个题目吧。