我用一些在线帮助编写了以下解决方案。目的基本上是找到一个人爬上n
阶梯的方式的数量,如果他在每一步都可以爬1
或2
步。
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
背后的直觉。由于我们可以采用1
或2
的长度,如果要攀爬的步骤总数为0
,那么我们不应该只返回0
(因为不能采取长度1
或2
的步骤)?不幸的是,如果我返回0
,我就无法得到正确答案。
有人可以解释究竟发生了什么以及返回1
(而不是0
)背后的直觉吗?
答案 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 == 1
和n == 2
才能获得所有n > 0
的正确答案1}}。然后你可以自由地解答n == 0
的正确答案。
根据请求,这里为什么在climbStairs(0)
为0时你需要额外的基本情况。(好吧,你需要额外的基本情况,或者你需要改变你的递归公式。)每当n
不是基本案例,climbStairs(n)
是根据climbStairs(n-1)
和climbStairs(n-2)
定义的。如果您将n == 0
案例定义为0,那么,正如您所注意到的那样,您无法获得n == 1
或n == 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 == 0
和n < 0
时返回0,那么我们的基本情况都会返回0,我们总是得到0作为我们的最终答案,因为return climbStairs(n-1)+climbStairs(n-2);
总是会执行0 + 0。不要担心零步骤的梯子甚至可以“爬” - 这只是让程序为更高的情况提供正确的答案。