从递归函数修改全局变量不能按预期工作

时间:2017-12-24 11:04:13

标签: javascript variables recursion sum global

我尝试使用全局变量生成一个递归函数来计算从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)

2 个答案:

答案 0 :(得分:0)

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));




答案 1 :(得分:0)

啊,我已经很清楚地找到了答案。似乎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!