基础案例背后的直觉,用于计算步数

时间:2016-12-27 03:32:13

标签: c++ algorithm recursion

我用一些在线帮助编写了以下解决方案。目的基本上是找到一个人爬上n阶梯的方式的数量,如果他在每一步都可以爬12步。

class Solution {
public:
    int climbStairs(int n) {
        if(n<0)
            return 0;

        //what is the logic used for the following return?
        if(n==0)
            return 1;

        return climbStairs(n-1)+climbStairs(n-2);
    }
};

虽然我或多或少知道自己到底在做什么,但如果要攀爬的步数是1,我就无法理解返回0背后的直觉。由于我们可以采用12的长度,如果要攀爬的步骤总数为0,那么我们不应该只返回0(因为不能采取长度12的步骤)?不幸的是,如果我返回0,我就无法得到正确答案。

有人可以解释究竟发生了什么以及返回1(而不是0)背后的直觉吗?

4 个答案:

答案 0 :(得分:2)

有一种方法可以爬楼梯:什么也不做。或者你可以用数学的方式来思考它:空的总和是0.

如果你对这种直觉感到不舒服,你可以改写你的代码以消除零情况:

int climbStairs(int n) {
    if (n == 1) return 1;  // 1
    if (n == 2) return 2;  // 1+1 or 2
    return climbStairs(n-1) + climbStairs(n-2);
}

附带你的实际问题,但这个函数是Fibonacci序列,并且有更好的方法(例如:线性或对数时间而不是指数)来计算它。

答案 1 :(得分:2)

不要根据有多少种不同的方法来考虑它,而是考虑到当你有n步骤离开时可以通过多少种方式登顶。如果n == 0您有一种方法可以登顶:保持原状。这就是直觉。

实际原因是,如果没有n == 0的定义,您需要另外两个基本案例,n == 1n == 2才能获得所有n > 0的正确答案1}}。然后你可以自由地解答n == 0的正确答案。

根据请求,这里为什么在climbStairs(0)为0时你需要额外的基本情况。(好吧,你需要额外的基本情况,或者你需要改变你的递归公式。)每当n不是基本案例,climbStairs(n)是根据climbStairs(n-1)climbStairs(n-2)定义的。如果您将n == 0案例定义为0,那么,正如您所注意到的那样,您无法获得n == 1n == 2的正确答案。因此,您必须将这些定义为附加基本案例。 (仅修复n == 1仍然无法为n == 2提供正确答案。)一旦建立了这些额外的基本案例,递归公式将继续为所有{{1}提供正确的答案}}

答案 2 :(得分:1)

当一个人爬楼梯时,让我说他爬上楼梯从A点到B点。现在,人们可以很容易地理解,在A和B之间有一些 n垂直距离和b n水平距离。其中a和b是每个楼梯的尺寸。

'Could someone please explain what exactly is going on and the intuition behind returning 1 (instead of a 0)?'

现在当有0级时,A和B之间没有垂直距离。但是必须覆盖“b”水平距离,这需要1步。

答案 3 :(得分:0)

如果我们在n == 0n < 0时返回0,那么我们的基本情况都会返回0,我们总是得到0作为我们的最终答案,因为return climbStairs(n-1)+climbStairs(n-2);总是会执行0 + 0。不要担心零步骤的梯子甚至可以“爬” - 这只是让程序为更高的情况提供正确的答案。