跳台阶问题

来源:互联网 发布:aix 多路径软件 编辑:程序博客网 时间:2024/05/13 05:08

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

    分析:在九月腾讯,创新工场,淘宝等公司最新面试十三题中第23题又出现了这个问题,题目描述如下:23、人人笔试1:一个人上台阶可以一次上1个,2个,或者3个,问这个人上n层的台阶,总共有几种走法?咱们先撇开这个人人笔试的问题(其实差别就在于人人笔试题中多了一次可以跳三级的情况而已),先来看这个第27题。

    首先考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级;另外一种就是一次跳2级。

    现在我们再来讨论一般情况。我们把n级台阶时的跳法看成是n的函数,记为f(n)。当n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);另外一种选择是第一次跳2级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-2)。因此n级台阶时的不同跳法的总数f(n)=f(n-1)+(f-2)。

    我们把上面的分析用一个公式总结如下:
        /     1                              n=1
f(n)=      2                              n=2
        \  f(n-1) + f(n-2)            n>2

    原来上述问题就是我们平常所熟知的Fibonacci数列问题。可编写代码,如下:

<div bg_cpp"="" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; border: 1px dashed rgb(153, 153, 153); background-color: rgb(245, 245, 245); width: 687.0499877929688px; color: rgb(51, 51, 51); line-height: 26px;">
  1. long long Fibonacci_Solution1(unsigned int n)  
  2. {  
  3.     int result[2] = {0, 1};  
  4.     if(n < 2)  
  5.         return result[n];  
  6.       
  7.     return Fibonacci_Solution1(n - 1) + Fibonacci_Solution1(n - 2);  
  8. }  

     那么,如果是人人笔试那道题呢?一个人上台阶可以一次上1个,2个,或者3个,岂不是可以轻而易举的写下如下公式:

        /      1                                      n=1
f(n)=      2                                      n=2

              4                                      n=3       //111, 12, 21, 3
        \  f(n-1)+(f-2)+f(n-3)            n>3

    行文至此,你可能会认为问题已经解决了,但事实上没有:

  1. 用递归方法计算的时间复杂度是以n的指数的方式递增的,我们可以尝试用递推方法解决。具体如何操作,读者自行思考。
  2. 有一种方法,能在O(logn)的时间复杂度内求解Fibonacci数列问题,你能想到么?

int fib(int n){    int f[3] = {1,2,4};    if(n < 3)        return f[n-1];    for(int i = 3;i < n;i++)    {        int tmp = f[0]+f[1]+f[2];        f[0] = f[1];        f[1] = f[2];        f[2] = tmp;    }    return f[2];}
0 0
原创粉丝点击