zoukankan      html  css  js  c++  java
  • 常见算法之13---跳台阶问题

    题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
    示例:有5个台阶,则有8种跳法。
    思想:使用递归,因为每次只能跳一个或两个,那么当它在N级的时候一定是从第N-1或N-2级跳过来的。
    所以有f(n)=f(n-1)+f(n-2),f(1)=1,f(2)=2。


    方案一:直接对上述思想进行编码
    f(int n){
        if(n==1)
            return 1;
        else if(n ==2)
            return 2;
        else
            return f(n-1)+f(n-2);

    }
    分析:使用这种方式,可读性很好,但是当n较大时,会非常耗时。
    例如,在我的笔记本上,n=50时,运行了60S,n=66时,运行了一个小时也没有运行出来。

    方案二:上面的递归方式,会导致大量的重复运算,使用数组保存其中的已经计算出来的数。
    cal(long[] f) {
        for(int i = 1;i<f.length;i++){
            if(i == 1)
                f[1]=1;
            else if(i==2){
                f[1]=1;
                f[2]=2;
            }
            else
                 f[i]=f[i-1]+f[i-2];
        }
           return f[f.length-1];
    }
    分析:这样的话,就节省了大量的时间。还是方案一种的输入n=50时,运行了4ms,n=66时,运行了15ms。

    方案三:若是输入的n比较小的话,可以直接用数组进行存储。
    如:long[] array = { 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610,
    987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368,
    75025, 121393, 196418, 317811, 514229, 832040, 1346269,
    2178309, 3524578, 5702887, 9227465, 14930352, 24157817,
    39088169, 63245986, 102334155, 165580141, 267914296,
    433494437, 701408733, 1134903170, 1836311903};
    分析:这样直接进行读取,速度最快。

    注:当n为92以后,会超过long的范围,导致错误的结果。解决方式是使用java中的大数类。

  • 相关阅读:
    PIE-Basic 自定义滤波
    PIE-Basic 常用滤波
    PIE-Basic 中值滤波
    PIE-Basic 均值滤波
    PIE-Basic 小波变换
    PIE-Basic 傅里叶变换
    PIE-Basic 去相关拉伸
    .net调用数据库执行Mysql存储过程,提示 Procedure or function XXXX Cannot be found in database xxx
    C#几种类型转换方法的个人总结
    Winform无法改变窗体大小
  • 原文地址:https://www.cnblogs.com/xiaoChongUp/p/3345206.html
Copyright © 2011-2022 走看看