从递归函数中修改全局变量无法正常工作



i尝试使用全局变量来制作递归函数以从1到n计算总和,但似乎没有预期的工作。

有人可以为我解释为什么?以下是JavaScript中的代码。

s = 0;
function sum(n) {
  if (n === 1) {
    return 1;
  }
  else {
    s = s + n + sum(n - 1);
  }
  return 0;
}
sum(5);
console.log('The sum from 1 to 5 is ' + s); // this return wrong value

我的目的是在全局变量s上创建副作用。因此,我认为所有堆栈帧都将按照此顺序调用,并且每次弹出时(从底部开始),S值将相应地更新。如果我理解这个错误,请更正。

s = s + 5 + sum(4)  // s = 10 + 5 + 0
return 0
------------------
s = s + 4 + sum(3)  // s = 6 + 4 + 0
return 0
------------------
s = s + 3 + sum(2)  // s = 3 + 3 + 0
return 0
------------------
s = s + 2 + sum(1)  // s = 0 + 2 + 1 
return 0
------------------
return 1            // s = 0 (from global)

啊,我发现答案非常整齐。似乎JavaScript解释器在右侧评估了s的时间稍早,因此弹出的堆栈框架的行为并不如预期的那样。因此,在这里我会发布自己的答案。对此非常满意:)

s = 0;
function sum(n) {
  if (n === 1) {
    return 1;
  }
  else {
    q = n + sum(n-1);   // break into 2  
    s += q;             // assignments like this
  }
  return 0;
}
sum(5);
console.log('The sum from 1 to 5 is ' + s); // this will be correct now!

else语句中,您需要返回s并删除return 0零件。在一行语句中,您可以写

s = 0;
function sum(n) {
   return n === 1 ? 1 : s += n + sum(n - 1);
}
sum(5);
console.log('The sum from 1 to 5 is ' + s); 

没有全局变量

function sum(n) {
   return n === 1 ? 1 : n + sum(n - 1);
}
console.log('The sum from 1 to 5 is ' + sum(6));

最新更新