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 就只是定义的整型数据,没有初值,所以会报错。 标签:递归,int,之上,第一层,climbStairs,第二层,楼梯 From: https://www.cnblogs.com/2874147746lijiacheng/p/17788948.html