递归之上楼梯

发布时间 2023-10-26 11:15:05作者: LIJIACHENG~

my code:

int f[46];

int climbStairs(int n){
    f[0] = 1;
    f[1] = 1;
    int i;
    for(i = 2 ; i <= n ; ++i){
        f[i] = f[i - 1] + f[i - 2];
    }return f[n];                    //原来写的是f [ i ] ,但是这是错的,因为 f [ i ]里面存储的是从第 i - 2 层上到 i 层的方法,缺少了前面累积的,而我理解的是此时f [ i ] 就是 f [ n ] ,因为 i++,此时跳出for循环,但是这是错的,原因放到领悟中。
}
 
优解:
int f[46];

int climbStairs(int n){
    f[0] = 1;
    f[1] = 1;
    int i;
    for(i = 2 ; i <= n ; ++i){
        f[i] = f[i - 1] + f[i - 2];
    }return f[n];
}
      //暂时还没有学会方便的解法,就照上面了
 
 
领悟:对自建函数可以理解为一个内部有递归的函数,想计算 f [ i ] 就必须知道 f [ i - 1 ] 和 f [ i - 2 ] 的值,而同理,求  f [ i - 1 ] 和 f [ i - 2 ],又需要知道前面对应的值,直到最初的状态,此处默认为第0层,所以f  [ 0 ] 为最终的终止处,其实理解起来像是累和,在第二层时,上到第二层只有两种情况,从第一层上一步和从第二层上两步,第n层就分析n - 1层和 n - 2 层,为什么感觉总值少了2呢?其实没有,因为从第0层开时,已经加过了,我们认为上到第0层用了一种方法,上到第一层也只有一种方法,从第0 层上一步,这样,f [ 0 ] == 1, f [ 1 ] == 1 就为初始值,通过不断加上每一层的情况,得到目的层的情况。回到上面的错误,为什么不是 f [ i ] ?这涉及到局部变量的知识,for循环中的i 在循环结束后就被销毁了,那么 i 就只是定义的整型数据,没有初值,所以会报错。