为什么在递归函数返回时变量会重置

时间:2018-01-22 02:21:19

标签: javascript recursion

我已经挣扎了几天,围绕递归函数。下面的代码片段是我试图自学的合并排序课程的一部分。我使用Google Chrome开发人员工具逐步执行此代码,并按以下顺序查看以下参数传递给函数ms(p,r)。

MS(0,6),MS(0,3),MS(0,1),MS(0,0)

到目前为止一直很好......

当ms()函数到达死角时,使用参数ms(1,1)调用下一个函数。

我明白到目前为止发生了什么。

接下来,变量'q'的值为ZERO,我不明白如何。我期待q = 1,因为在代码的这一点上,表达式q = Math.floor((p + r)/ 2)仍应保留q的值,即1。

为什么会恢复为零?

提前感谢您的帮助。

<script>

a = [4,1,6,7,5,2,3];
var q=0;

function ms(p,r){
  if(p<r){
  q=Math.floor((p+r)/2);
  ms(p,q);
  ms(q+1,r);
  m(p,q,r);
  }   
}

function m(p,q,r){
 //do something
}

ms(0,6);

</script>

1 个答案:

答案 0 :(得分:0)

在第一个递归ms() q=Math.floor((0+1)/2)的最后一个 - &gt;之前0 - &gt; ms(0,0)。由于q是全局的,因此其设置会在全球范围内更改。因此,在ms(0,1)的上下文中,在第一次递归调用后,ms(p,q)q为0,因此下一个调用ms(q+1,r)ms(0+1,1) - &GT; ms(1,1)

这是你的困惑吗?

我怀疑你不希望q是全局的,因为你应该将每次迭代调用的数组的计算部分拆分为ms()

function ms(p,r) {
  if(p<r){
    var q=Math.floor((p+r)/2);
    ms(p,q);
    ms(q+1,r);
    m(p,q,r);
  }   
}