[LeetCode系列]爬梯问题的递归解法转换为迭代解法
有一个n阶的梯子, 你每次只能爬1阶或2阶, 请问共有多少种登顶的爬法?(正好爬完n阶, 不能多也不能少)
本题最优解是直接套用菲波那切数列即可(因为菲波那切数列的第n个元素正好等于第n-1个元素和第n-2个元素的和, 与本题的要求完全相同).
递归解法:
1 int climbStairs(int n) {
2 if (n < 3) return n;
3 return climbStairs(n-1) + climbStairs(n-2);
4 }
思路很清晰, 递归到当前阶数小于3阶时返回种类(因为比较容易计算, 并非一定是3阶), 这也是求解菲波那切数列的递归解法.
然而实际中这种解法对栈要求过大, 非常容易溢出. 因此有必要转化为迭代算法:
1 int climbStairs(int n) {
2 vector<int> count(n+1);
3 count[0] = 0;
4 count[1] = 1;
5 count[2] = 2;
6 for (int i = 3; i <= n; i++)
7 count[i] = count[i-1] + count[i-2];
8 return count[n];
9 }
简单总结一下: 从递归->迭代时, 只需要把思考过程转换为这种数列求解的思路, 从前几个元素开始向后推导即可, 推导的关系则与递归的返回表达式非常相似.
Showing off sucks.