我一直在看这段代码,花了太长时间摸索着,希望能深入了解值33到底是什么结果。
我知道,如果满足b == 1条件,则该代码将遍历条件到else并减小b的值,直到达到else。
我不明白的是,如果b的值从那时起一直递增,那么'a'的值也会递增,直到达到33的最终值。
此代码的另一个奇怪特征是,在else if进行了这些更改之后,只有else运行,并且不再检查其他条件。
对于一个相对较不熟悉递归的人来说,这种行为确实很奇怪。
function mlt(a, b) {
debugger;
if(!(a && b)) {
return 0;
} else if (b == 1) {
return a;
} else {
return (a + mlt(a, b - 1));
}
}
console.log(mlt(3, 11));
将其复制到浏览器控制台中并在循环中运行将使您深入了解我所从事的工作。
答案 0 :(得分:1)
这不是闭包的例子,而是递归的例子。
为了了解递归如何带来正确的结果,它可以帮助暂时假设递归调用返回正确的结果,并查看是否使整体返回值正确。
让我们以这个主要电话为例:
mlt(20, 4)
执行将转到else
部分并执行递归调用:
return (a + mlt(a, b - 1));
您可以得出,递归调用归结为mlt(20, 3)
。现在让我们暂时假设此递归调用返回正确的结果,即60。看看上面的表达式会发生什么:
return (20 + 60);
这是80,对于我们的原始呼叫mlt(20, 4)
,确实是正确的结果。因此,如果我们可以假定该函数也对b
正确地进行操作,那么我们可以了解该函数如何为给定的b-1
返回正确的乘积。
b = 1
会发生什么?然后该函数返回a
。我们还可以看到这是正确的。因此,根据前面的结论,我们现在可以确定,如果b >= 1
的结果是正确的。
请注意,当第一个b = 0
插入时,该函数也将正确执行if
。另外请注意,该函数不能 很好地应对负值。 b
:在这种情况下,该函数将继续执行b-1
,最终会遇到堆栈容量错误。
答案 1 :(得分:1)
在网上闲逛之后,我发现a great article可以为该主题的新手清楚地解释JS中的递归。 解释和代码示例帮助我更好地理解了。
简而言之,这段代码将加3、11倍,等于33。当1减去1时,我们达到第二个条件。然后,一个匿名函数返回11倍。
我希望它也可以帮助在这个问题上绊倒的其他人。