zoukankan      html  css  js  c++  java
  • 跳台阶问题

       题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。

       在这里看到这道面试题,思路是:

          1)每次可以跳1级,也可以跳2级,如果当前只有1级台阶,那么就只有一次跳法;如果当前只有2级台阶,就有2种跳法(一种是每次跳1级,跳2次;另一种是一次跳2级,就跳完),也即 f(1) = 1; f(2) = 2。

          2)假设有n级台阶要跳,如果最后一步是跳1级,那么剩下的就只有前面的n-1级台阶的步数了;如果最后一步是跳2级,那么剩下的就是前面n-2级台阶的步数了。总结两种情况,得出状态转移方程:

          f(n) = f(n-1) + f(n-2)。

         经过上面的过程,可以写出这样的代码:   

    int jumpstep(int n){
      if(n == 1 || n == 2)
        return n;
      else
        return jumpstep(n-1) + jumpstep(n-2);
    }
             代码行数很少了,但是效率很低,因为有很多重复计算,于是,想出了另一个:

    int jumpstep2(int n){
      if(n == 1 || n ==2)
        return n;
      int *a = new int[n+1];
      a[1] = 1;
      a[2] = 2;
      for(int i = 3; i <= n ; ++i){
        a[i] = a[i-1] + a[i-2];
      }
      int ret = a[n];
      delete []a;
      return ret;
    }
         用一个表了记录计算结果。接着,来粗劣测试一下这两种方法的运行时间。上测试代码:

    #include<iostream>
    #include<time.h>
    using namespace std;
    
    int jumpstep2(int n){
      if(n == 1 || n ==2)
        return n;
      int *a = new int[n+1];
      a[1] = 1;
      a[2] = 2;
      for(int i = 3; i <= n ; ++i){
        a[i] = a[i-1] + a[i-2];
      }
      int ret = a[n];
      delete []a;
      return ret;
    }
    
    int jumpstep(int n){
      if(n == 1 || n == 2)
        return n;
      else
        return jumpstep(n-1) + jumpstep(n-2);
    }
    
    void test_time(int (*func)(int), int n){
      long bTime = clock();
      cout<<"-----------------------------------"<<endl;
      cout<<"result is: "<<func(n)<<endl;
      long eTime = clock();
      cout<<"cost time: "<<(eTime - bTime)<<"ms"<<endl;
    }
    
    void test(){
      int n;
      cout<<"input n to test: ";
      cin>>n;
      test_time(jumpstep, n);
      test_time(jumpstep2, n);
    }
    
    int main(){
      test();
      return 0;
    }
    

        运行结果如图:





      统计为如下表:


       当n = 50的时候,递归版本非常慢,等了好久都没出结果,于是干脆不等了。 当n比较大时,非递归版本运行速度比较高。


    参考:

    http://zhedahht.blog.163.com/blog/static/25411174200731844235261/

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    视图和触发器
    45题的难点
    表连接、Tsql基本编程和存储过程
    五种函数、子查询和分页查询
    语句创建数据库表及增删改查
    约束
    pyhton的参数类型
    python的数组与集合
    python基础--编码
    NSIS的Push与Pop
  • 原文地址:https://www.cnblogs.com/Rex7/p/4752566.html
Copyright © 2011-2022 走看看