常见算法之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中的大数类。

原文地址:https://www.cnblogs.com/xiaoChongUp/p/3345206.html