题目:一只青蛙一次可以跳1级台阶,也可以跳2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
这道题还被ITEye放在了博文视点杯有奖答题活动里面。
我提供三种解法。
1、递归求解:
青蛙每跳一次前,有这样三种情况:
(1)只剩1级或0级台阶了,只能跳一步或者无法再跳了,那么这条路也走到了终点,走法的种类数可以加1;
(2)可以走2级台阶;
(3)可以走1级台阶。
于是递归方法求解:
/**
* 递归方法
*/
public static int calc(int n) {
return recursiveCalc(n, 0);
}
private static int recursiveCalc(int n, int total) {
if (1 == n || 0 == n)
return ++total;
total = recursiveCalc(n - 1, total);
return recursiveCalc(n - 2, total);
}
2、概率论思路求解:
首先把问题抽象成简单的数学模型,设2步台阶跳了x次,1步台阶跳了y次,那么:
2x + y = n
于是,当 x = i ,可知 x >= 0 ,且 x < n/2 (向下取整),设某时刻的 x = i ,那么有 y = n - 2 * x ,于是,总共需要走 z = i + n - 2 * x 步。
这时,问题即转化为:
z步骤中,有x个两步,y个一步,相当于z个空当,由x、y去填充,那么不同填充方法的数目符合概率公式:
C(x,z) = z! / ((z-x)!x!)
即从排列z中取其中x个数的种类,x内部无序:
/**
* 概率论
*/
public static int calc2(int n) {
int total = 0;
for (int i = 0; i <= n / 2; i++)
total += factorial((i) + (n - 2 * i)) / factorial(i)
/ factorial(n - 2 * i);
return total;
}
private static int factorial(int n) {
if (0 == n)
return 1;
int total = 1;
for (int i = 1; i <= n; i++)
total *= i;
return total;
}
3、数学归纳法求解:
如果n=1,总步数f(n)=1;如果n=2,总步数f(n)=2。
另一方面,当n>=3,当前还剩的步数f(n),如果接下去跳一步,那么还剩下的步数是f(n-1);如果接下去跳两步,那么还剩下的步数是f(n-2),故:f(n)=f(n-1)+f(n-2)。
现设s3=f(n),s2=f(n-2),s1=f(n-1),从时间、空间复杂度来说,这也是最简单的一种方法:
/**
* 数学归纳法
*/
public static int calc3(int n) {
if (1 == n || 2 == n)
return n;
int s1 = 1, s2 = 2, s3 = 1;
for (int i = 3; i <= n; i++) {
s3 = s1 + s2;
s1 = s2;
s2 = s3;
}
return s3;
}
聪明的你,还有什么办法?
欢迎和我讨论。 :)
文章系本人原创,转载请注明作者和出处
分享到:
相关推荐
0 资源分 八皇后 的三种解法 (java编写)
用C#实现迷宫路径问题的两种解法:广度优先搜索和递归搜索。其中包含三个类:迷宫类,双向队列类和主Form类。两种搜索方式均封装在迷宫类中。
0-1背包问题的3种详细解法和比较 详细讲解了0-1背包问题的动态规划 回溯法 分支界限法的解法 及其比较
哲学家进餐三种解法及其详细解释哲学家进餐三种解法及其详细解释哲学家进餐三种解法及其详细解释哲学家进餐三种解法及其详细解释哲学家进餐三种解法及其详细解释哲学家进餐三种解法及其详细解释哲学家进餐三种解法...
反问题的数值解法.pdf图书。肖庭延、于慎根、王彦飞著,科学出版社,274页。
约瑟夫环的三种解法
Josephus的几种解法
主元素问题解法4.rar 主元素问题解法4.rar 主元素问题解法4.rar 主元素问题解法4.rar 主元素问题解法4.rar 主元素问题解法4.rar 主元素问题解法4.rar 主元素问题解法4.rar 主元素问题解法4.rar 主元素问题解法4.rar ...
w12-课堂1-三种解法.zip
问题解法 微积分学辞典
青蛙跳跃小游戏的解法
约瑟夫环的三种解法JosephRing-master.zip
小学数学数学日记四年级第三种解法
热传导问题的数值解法zip,热传导问题的数值解法
初中数学几何阴影面积的三种解法.doc
阶微分方程初值问题的数值解法高阶微分方程初值问题的数值解法高阶微分方程初值问题的数值解法
约瑟夫环问题的链表和数组两种解法 设有N个人围坐一圈并按顺时针方向从1到N编号,从第S个人开始进行1到M报数,报到第M个人时,此人出圈,再从他的下一个人重新开始1到M的报数,如此进行下去直到所有的人都出圈为止,...