努力掌握JavaScript中的递归

努力掌握JavaScript中的递归,javascript,recursion,Javascript,Recursion,现在我正在浏览Codecademy的递归轨迹,我不知道如何解释这个正确的代码 // Create an empty array called "stack" var stack = [] // Here is our recursive function function power(base, exponent) { // Base case if ( exponent === 0 ) { return 1; } // Recursive case else {

现在我正在浏览Codecademy的递归轨迹,我不知道如何解释这个正确的代码

// Create an empty array called "stack"
var stack = []
// Here is our recursive function
function power(base, exponent) {
  // Base case 
  if ( exponent === 0 ) {
    return 1;
  }
  // Recursive case
  else {
    stack[exponent-1] = base * power(base, exponent - 1); //confused by start of this line
    return stack[exponent-1];
  }
}
power(3,3)
console.log(stack) // [3,9,27]
如果指数-1变为2,然后变为1,然后变为0,为什么3会成为数组中第0个位置的元素,而不是第2个位置的元素,依此类推


我真的很感激任何帮助

在第一个过程中,指数是3,因此您将在堆栈[2]中存储一个值。但直到递归调用使用power3,2…power3,1完成后,才会计算该值


因此,对堆栈[3-1]的赋值前面是对堆栈[3-2]的赋值,而对堆栈[3-2]的赋值前面又是对堆栈[3-2]的赋值

power(3, 3)   stack[2] = 3 * power(3, 2)
power(3, 2)   stack[1] = 3 * power(3, 1)
power(3, 1)   stack[0] = 3 * power(3, 0)
power(3, 0)   return 1
然后替换以下值:

stack[0] = 3 * 1
stack[1] = 3 * 3
stack[2] = 3 * 9

请注意,在这个调用的执行过程中有四个不同的指数,power调用的每个范围中都有一个指数

打电话给power3,3 指数'=3 不是0 呼叫power3,2 指数=2 不是0 呼叫power3,1 指数'=1 不是0 呼叫power3,0 指数=0 是0 返回1 将返回值乘以3 将其分配给堆栈[指数'-1]:堆栈[0]=3 返回3 将返回值乘以3 将其分配给堆栈[指数-1]:堆栈[1]=9 返回9 将返回值乘以3 将其分配到堆栈[exponent'-1]:堆栈[2]=27 返回27 记录堆栈的值 实际上,堆栈是在从递归调用返回之后而不是在进入它们之前向后构建的。如果希望更好地表示调用堆栈,可以尝试添加

callstack.push(exponent);

在函数体的第一行。在执行脚本之后,调用堆栈看起来就像您所期望的那样[3,2,1,0]。

因为第一个结果是最高的,所以它向后分配数组位置。第一个是stack[2]=27,它将27放在数组的第三个位置。你确定吗?我这样问是因为我在返回语句之前编写了console.logstack,它分别给了我[3][3,9]和[3,9,27]的输出。如果它最初计算数组的第二个位置,那有什么意义呢?因为递归,您将首先返回最深的[3]。然后它继续返回堆栈。我想我找到了。所以基本上它会进行所有的计算,直到它有一个清晰的值,而不是递归调用,在本例中是3。然后它就可以对阵列中的后续位置进行计算。对吗?谢谢你的帮助。是的@Bergi的回答有一个很好的逻辑分解。谢谢你的帮助。我想我明白了。因此,一旦返回1,未添加到数组b/c的指数-1将等于堆栈[-1]。然后可以计算幂3,1,因为它等于3*power3,0,返回为1,3*1是3。和堆栈[1-1]=0。然后power3,2可以运行b/c,它的3*power3,1,我们现在知道是3。所以3*3是9,stack[2-1]=1,等等。我猜它只是在我键入这个时点击的。谢谢。@Gwater17:基本上是的。