第39台阶:
小明刚刚看完电影《第39级台阶》。离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?
请你利用计算机的优势,帮助小明寻找答案。
解题思路:
假设要右脚到达第39台阶,那么等同于前一步左脚在第38台阶或者第37台阶。
而若左脚在第38台阶,那么右脚则应在第37或第36台阶。
以此类推....
因此:
39右脚的上法数 = 38左脚上法数 + 37左脚上法数;
38左脚的上法数 = 37右脚上法数 + 36右脚上法数;
........
递归实现:
public class Main{
public static void main(String[] args){
System.out.println(rfoot(39));
}
//左脚位于第n台阶的种数
public static long lfoot(int n){
if(n==0) return 0;
if(n==1) return 1;
return rfoot(n-1) + rfoot(n-2);
}
//右脚位于第n台阶的种数
public static long rfoot(int n){
if(n==0) return 1;
if(n==1) return 0;
return lfoot(n-1) + lfoot(n-2);
}
}
非递归实现:
public class Main{
public static void main(String[] args){
int[][] step = new int[39][2];// 第一维是39层阶梯,第二维是左右脚
// 对于第一级阶梯,左脚有1种方法到达,右脚0种(因为题目要求先迈左脚)
step[0][0] = 1;
step[0][1] = 0;
// 对于第二级阶梯,左脚有1种方法到达,右脚有1种
step[1][0] = 1;
step[1][1] = 1;
for (int i = 2; i < 39; i++) {
step[i][1] = step[i - 2][0] + step[i - 1][0];
step[i][0] = step[i - 2][1] + step[i - 1][1];
}
System.out.println(step[38][1]);
}
ps:非递归程序出处:http://blog.csdn.net/u013091087/article/details/43735705?locationNum=6