递归解法(C++):
class Solution {
public:
int climbStairs(int n) {
if(n==1)
{
return 1;
}
else if(n==2)
{
return 2;
}
else
{
return climbStairs(n-1)+climbStairs(n-2);
}
}
};
第一个实现使用了递归方法,它的思路是将问题分解为两个子问题,即要么从第 n-1 个台阶跳一步,要么从第 n-2 个台阶跳两步。然后递归地解决这两个子问题,将它们的结果相加,最终得到答案。
这个方法的问题是它会重复计算很多相同的子问题,效率较低。因为对于相同的 n,可能需要计算多次,导致指数级的计算复杂度。
class Solution {
public:
int climbStairs(int n) {
int p = 0, q = 0, r = 1;
for (int i = 1; i <= n; ++i) {
p = q;
q = r;
r = p + q;
}
return r;
}
};
第二个实现使用了迭代方法,它采用了动态规划思想,从底向上逐步计算解决方案。在这个方法中,使用了三个变量 p、q 和 r 分别表示 n-2、n-1 和当前 n 台阶的不同爬楼梯的方式数量。从 n=1 开始迭代计算直到 n,最终 r 的值就是问题的解。
这个方法的优点是它不会重复计算相同的子问题,因此计算效率更高,时间复杂度是线性的,而不是指数级的。
总结:迭代方法更高效,因为它避免了重复计算子问题,而递归方法会在计算过程中多次重复相同的子问题,导致性能下降。因此,在解决类似的问题时,推荐使用迭代的动态规划方法。