基本案例背后的直觉用于计算步骤数

Intuition behind the base case for counting the number of steps

本文关键字:计算 用于 直觉 案例 背后      更新时间:2023-10-16

我在在线帮助下对以下解决方案进行了编码。基本上,目的是找到一个人可以爬上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);
    }
};

虽然我或多或少地意识到自己在做什么,但如果要爬升的步骤数为 0,我无法理解返回1背后的直觉。由于我们可以迈出长度的12,因此,如果要爬升的步骤是0,那么我们不应该仅返回0(因为无法采取长度的12的步骤)?不幸的是,如果我返回0

我没有正确的答案

有人可以解释到底发生了什么以及返回1的直觉(而不是0)?

,而不是以几种不同的方式来思考它,您可以采取多种措施,而是考虑到n时可以达到最高的方式来考虑它距离攀登的台阶。如果n == 0您有一种方法可以到达顶部:留在原处。那是直觉。

实际原因是,如果没有n == 0的定义,则需要两个基本案例,n == 1n == 2可以为所有n > 0获取正确的答案。然后,您可以自由地解决n == 0的正确答案。

根据请求,这就是为什么climbStairs(0)为0,您需要其他基本案例。(嗯,要么需要其他基本案例,要么需要更改递归公式。)每当n不是基本情况时,都会定义climbStairs(n)climbStairs(n-1)climbStairs(n-2)而言。如果将n == 0情况定义为0,那么,正如您注意到的那样,您将无法获得n == 1n == 2的正确答案。因此,您必须将这些定义为其他基本案例。(仅修复n == 1仍然不会给n == 2给出正确的答案。)一旦建立了其他基本案例,递归公式将继续为所有n > 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);
}

附带您的实际问题,但是此功能是斐波那契序列,并且有更好的方法(例如:线性或日志时间而不是指数)来计算它。

当一个人爬楼梯时,假设他通过爬上楼梯从A点到B点。现在,正如人们很容易理解的那样,A和B之间有一些a和b之间的垂直距离,而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步。

如果我们在 n == 0n < 0时返回0,则两个基本案例都将返回0,并且我们始终将获得0作为最终答案,因为return climbStairs(n-1)+climbStairs(n-2);始终执行0 0。不用担心,甚至根本可以"攀登"具有零步骤的梯子 - 这与使程序提供正确的答案有关。