39级台阶问题

来源:互联网 发布:网站权限数据库设计 编辑:程序博客网 时间:2024/05/18 00:41

题目:第39级台阶

小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!

站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?

请你利用计算机的优势,帮助小明寻找答案。

要求提交的是一个整数。

程序分析:

这个程序不要纠结在左脚和右脚的问题上,从中抽象出限制条件:一共走的步数是偶数;

我们可通过递归来实现,对每次递归的结果进行判断,如果走过的台阶数为39,则递归结束,判断走的步数是否为偶数,为偶数则为上法计算器加一,否则为无效上法。

递归算法:

Java

    public class Test003 {                    private static int count;                    public static void main(String[] args) {              count = 0;              walkUp(0, 0);              System.out.println(count);          }                    /**          * 模拟上台阶          *           * @param step 使用的步数,范围0-39          * @param tj 总过的台阶数,范围0-39          */          private static void walkUp(int step, int tj){              if(tj > 39){                  return;              }                            if(tj == 39){                  if(step%2 == 0){                      count++;                  }                  return;              }                            walkUp(step+1, tj+1);              walkUp(step+1, tj+2);          }                }  

C++

    #include<iostream>      using namespace std;      int count=0;      void fun(int stair,int step)      {   //stari用于表示剩余的楼梯的层数,当等于0时停止递归          //step是走过的步数,用来判断是否是偶数,是否符合要求           if(stair<0)return;            if(stair==0)   //39节楼梯全部走完            {              if(step%2 == 0)count++;              return;           }            fun(stair-1,step+1);   //这一步走了一个台阶            fun(stair-2,step+1);   //这一步走了两个台阶       }      int main()      {          fun(39,0);          cout<<count<<endl;          return 0;       }  

非递归算法:

package exercise;/** * 39级台阶问题 * @author Administrator * */public class Main_exer {        public static void main(String[] args) {       //动态DP思想        //创建一个39*2数组的二维数组s[i][j]        //i表示第N级台阶,j表示在该台阶上为左脚0,右脚1        //s[i][j]表示在i级台阶,刚好为j脚,总共可能得情况个数        int[][] s = new int[39][2];        //定义初始值,数组是从0-38,表示1-39级台阶        //以下四个初始值你都不理解得话,别学编程了        s[0][0]=1;//第一级台阶,左脚的情况个数只有1次        s[0][1]=0;//第一级台阶,右脚的情况个数只有0次,因为第一次漫的必定为左脚        s[1][0]=1;//第二级台阶,左脚的情况个数只有1次        s[1][1]=1;//第二级台阶,右脚的情况个数只有1次        //循环计算        for(int i = 2;i<39;i++){            //s[i][0]的值刚好是s[i-1][1]的情况再漫左脚一个台阶,刚好到达s[i][0]            //或者s[i-2][1]的情况再漫左脚两个台阶,刚好到达s[i][0]            //所以s[i][0]的值等于以上两个之和            s[i][0] = s[i-1][1] + s[i-2][1];            //原理同上            s[i][1] = s[i-1][0] + s[i-2][0];        }        for(int i=0;i<s.length;i++){        for(int j=0;j<s[0].length;j++){        System.out.print(s[i][j] + " ");        }        System.out.println();        }    }      }
参考:http://blog.csdn.net/bear_huangzhen/article/details/50068077

http://ask.csdn.net/questions/346001

http://blog.csdn.net/qsyzb/article/details/18991233

0 0
原创粉丝点击