算法笔记-递归之爬楼梯问题

问题描述:

熊孩子Davis家有一个楼梯,这个楼梯总有n级台阶,Davis每次只能爬1、2或者3阶,他有几种不同的爬法?

 Sample:

 ***** Input:
 ***** 3
 ***** Output:
 ***** 4


 ***** Input:
 ***** 7
 ***** Output:
 ***** 44
我们可以这样思考这个问题:假如有n阶,那么最后一步爬到n阶的方法有:从n-1阶爬1阶,从n-2阶爬2阶,从n-3阶爬3阶,则可将其演化公式 step(n) = step(n-1) + step(n-2) + step(n-3)
直接使用斐波那契数列来解决:
- (NSInteger)stepPermsWithStaircaseNumbers(NSInteger)staircaseNumbers{
     if (staircaseNumbers == 1) { 
      return 1; 
       } else if(staircaseNumbers == 2) { 
      return 2; 
       } else if (staircaseNumbers == 3) {
      return 4; 
       } else { 
        return [self stepPermsWithStaircaseNumbers:staircaseNumbers-1] + [self
   stepPermsWithStaircaseNumbers:staircaseNumbers-2] + [self
   stepPermsWithStaircaseNumbers:staircaseNumbers-3]; 
   }
 }
在用斐波那契数列时,如果当n变大时(比如输入50,将会很久才能得到结果,甚至程序崩溃),计算效率会非常低。
优化方案:在斐波那契数列算法中,其实有大量的计算是重复的,导致程序会非常慢,我们要做的就是记录下这些数值,从小往大算,每个只计算一次。
- (NSInteger)optimizationStepPermsWithStaircaseNumbers:(NSInteger)staircaseNumbers {
    if (staircaseNumbers == 1) {
        return 1;
    } else if (staircaseNumbers == 2) {
        return 2;
    } else if (staircaseNumbers == 3) {
        return 4;
    } else {
        NSInteger value = 0;
        NSInteger value1 = 1;
        NSInteger value2 = 2;
        NSInteger value3 = 4;
        for (NSInteger i = staircaseNumbers - 3; i <= staircaseNumbers; i++) {
            value = value1 + value2 + value3;
            value1 = value2;
            value2 = value3;
            value3 = value;
        }

        return value;
    }
}
优化方案中也可以借助数组或者字典来记录这些数值,我这边就直接粗暴的使用变量了,感觉会更直观一些。

猜你喜欢

转载自blog.csdn.net/siyue_tian/article/details/81192406