Javascript 理解递归函数中的堆栈跟踪
我正在学习递归和堆栈的工作原理。我很难理解这个函数中的堆栈跟踪以及为什么我的console.log语句会说出它们的作用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
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语句中再次调用了函数。明白了,我看到了我的错误,以及增加了我困惑的原因。