Javascript 理解递归函数中的堆栈跟踪

Javascript 理解递归函数中的堆栈跟踪,javascript,recursion,computer-science,Javascript,Recursion,Computer Science,我正在学习递归和堆栈的工作原理。我很难理解这个函数中的堆栈跟踪以及为什么我的console.log语句会说出它们的作用 function expoRecursion(base, exp) { debugger; if(exp == 1) { console.log('the exp value is ' + exp + ' , base is returned'); return base; } else { console.log('line 278 the

我正在学习递归和堆栈的工作原理。我很难理解这个函数中的堆栈跟踪以及为什么我的console.log语句会说出它们的作用

function expoRecursion(base, exp) {
  debugger;
  if(exp == 1) {
    console.log('the exp value is ' + exp + ' , base is returned');
    return base;
  } else {
    console.log('line 278 the function evaluates ' + expoRecursion(base, exp -1));
    return base * expoRecursion(base, exp-1);
  }
}
expoRecursion(2,3);
我已经在Chrome开发工具中运行了这一点,并对其进行了详细介绍,但似乎无法理解为什么在exp为1时返回基本情况后,我们会弹出expoRecursion(2,2-1),然后转到expoRecursion(2,3-1),然后在已经计算的情况下再添加回堆栈expoRecursion(2,2-1)?然后,我的日志语句中似乎出现了困惑,它们读到:

the exp value is 1 , base is returned  
line 278 the function evaluates 2  
the exp value is 1 , base is returned  
line 278 the function evaluates 4  
the exp value is 1 , base is returned  
line 278 the function evaluates 2  
the exp value is 1 , base is returned  

为什么最后一个语句是2,然后最终返回值返回为8

其他人已经指出了你困惑的基础:你在else子句中重复出现了两次。我认为这将为您清理它:只重复一次,保存结果,并在两个地方使用它:

} else {
    recur_result = expoRecursion(base, exp -1);
    console.log('line 278 the function evaluates ' + recur_result);
    return base * recur_result;
}

查看这是否符合您的期望。

您正在通过调用
exporcursion
函数来创建新的递归,以记录其结果
console.log(..…exporcursion(base,exp-1))
log语句和return语句都调用递归。这可能不是你想要的。哦,糟了,我没有意识到我在console.log语句中再次调用了函数。明白了,我看到了我的错误,以及增加了我困惑的原因。