我是新人,并且一直在努力尝试在我的大脑中对此进行合理化,但似乎无法理解它。首先是许多人使用简单的" for"循环:
function power(base, exponent){
var result = 1;
for(var i = 0; i < exponent; i++){
if(exponent == 0)
return 1;
else
result *= base;
};
return result;
}
在本节中,我将阅读有关递归和讨论函数如何调用自身的内容,只要它不会导致堆栈溢出。代码如下:
function power(base, exponent) {
if (exponent == 0)
return 1;
else
return base * power(base, exponent - 1);
}
console.log(power(2, 3));
我遇到的问题是理解它是如何运作的,这就是我认为正在发生的事情:
经过第一次&#34;如果&#34;声明它移动到&#34;否则&#34;并且调用自身返回if语句的顶部,减去1,每次直到它达到0,它将返回&#34;结果&#34;。是对的吗?或者我完全错过了什么?
答案 0 :(得分:1)
好的,让我们分一步看看:
你致电pow(2, 3)
首先,它运行此代码:
function power(base, exponent) {
if (exponent == 0)
return 1;
else
return base * power(base, exponent - 1);
}
代入值:
function power(base /* 2 */, exponent /* 3 */) {
if (3 == 0)
return 1;
else
return 2 * power(2, 2);
}
加快这个答案,我将从现在开始将它呈现在一个表格中:
第一个电话解析为
1)2 * power(2, 2);
2)2 * (2 * power(2, 1))
3)2 * (2 * (2))
(在最后一个,指数是1,所以它返回基数或2)
每次循环时,它基本上是基础的答案
就像循环一样,在示例中,
2 * (2 * (2)) === 8
,所以power(2, 3) === 8
答案 1 :(得分:0)
递归不是迭代的,它不会使函数返回任何地方,它使函数启动自身的另一个实例以进一步解决其结果。
让我们考虑一个更简单的例子。此函数从给定数字向下计数到0,并且每次可被5整除时都会大喊“FIVE”和当前数字:
function foo(anumber)
{
if(anumber <= 0)
{
console.log("Reached 0, done.");
}
else
{
if(anumber % 5 == 0)
{
console.log("FIVE - " + anumber);
}
foo(anumber - 1);
}
}
foo
检查数字是否等于或小于零,如果不是,检查它是否可被5整除,如果是,则大喊大叫,无论是否发起另一个foo
检查数字更低一个人。当foo
的实例最终达到0时,链不会继续并且堆栈崩溃。
这种递归的简单使用几乎只用于函数式编程,它规定变量和迭代循环对代码都不好并导致混乱。通常它使用循环更简单,通常RAM更高效。
递归只有更复杂的例子才能发挥其潜力,但我确信基础知识解释了解那些不会成为问题。