在递归中使用全局变量是一种好的做法吗

Is it good practice to use global variables in recursion

本文关键字:一种 递归 全局变量      更新时间:2023-09-26

我正在帮助一个人完成他的学校作业——我们正在尝试编写递归函数(如果重要的话——用PHP或JavaScript)。

我很了解递归的原理,但我从来没有从"学术"的角度写过这些。

使用全局变量来存储结果是否是一种好的做法,比如:

var results = [];
var rec = function(a) {
    ...
    if (match)
        results.push(someValue);
}

或者我应该使用return来收集所有这些结果(这会更加困难)?

最好尽可能少地使用全局变量,最好不要使用1

为了避免递归中需要全局变量,可以使用一个使用闭包的内部函数:

var rec = function(a) {
    var someValue = [];
    function dorec() {
      // stuff happens
      if (match)
        results.push(someValue);
      }
    }
    dorec();  
}

1Douglas Crockford状态

所有变量在使用前都应声明。JavaScript不需要这样做,但这样做会使程序更容易阅读,并使更容易检测可能成为隐含的未声明变量全球。不应使用隐含的全局变量。使用全局变量应该最小化。

为了扩展现有的注释并给您一个具体的例子,下面是将偶数递归添加到给定数组的代码:

var match;
var rec = function(a, res) {
    if (a < 0) {
        return res;
    }
    match = a % 2 == 0;
    if (match) {
        res.push(a);
    }
    return rec(a - 1, res);
}
var results = rec(10, []);
alert(results);

和小提琴:http://jsfiddle.net/xukukggL/