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

时间:2017-04-06 15:23:38

标签: 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 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?

1 个答案:

答案 0 :(得分:1)

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

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

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