我已经挣扎了几天,围绕递归函数。下面的代码片段是我试图自学的合并排序课程的一部分。我使用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>
答案 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);
}
}