在递归函数中,存储结果的位置?

时间:2011-03-21 13:55:56

标签: javascript arrays recursion boolean return-value

我目前正试图让JavaScript为布尔函数生成真值表。给定一个函数,代码应该只列出所有可能的布尔组合,并使用每个组合的函数输出。

至于生成所有组合,我把它放在一起(仅简化为组合代码):

var table = [];
function combinations(current) {
    var current = current || [];
    if(current.length === 3) {
        table.push(current);
    } else {
        var c = copy(current);
        c.push(true);
        combinations(c);

        c = copy(current);
        c.push(false);
        combinations(c);
    }
}

function copy(a) {
    var r = [];
    for(var i = 0; i < a.length; i++) r.push(a[i]);
    return r;
}

combinations(); // now table consists of each pair of 3 boolean values

所以基本上当它到达一个组合(即current.length === 3)时,它会将结果记录推送到table。但是,我想知道这是否是存储递归函数结果的推荐方法。

我面临在递归函数中使用return的建议,但是如何实现这样的事情 - 即,如果最后combinations必须返回包含所有元素的数组,那么有可能这样做吗?当然,我最后只能使用return table,但实际上我正在寻找一种在函数内部完成所有操作的方法,而不需要像现在这样的外部变量。

那么,如何让combinations在不使用外部变量的情况下将结果作为数组返回?

4 个答案:

答案 0 :(得分:4)

使用Array.concat()

function combinations(current) {
    var current = current || [];
    if(current.length === 3) {
        return [current];
    } else {
        return combinations(current.concat(true)).concat(combinations(current.concat(false)));
    }
}

var table = combinations(); // now table consists of each pair of 3 boolean values

console.log(table);

更优雅,没有?

Demo →

答案 1 :(得分:2)

为避免污染全局空间,可以使用闭包来包含递归函数。在http://drewwells.net/blog/2010/recursion-in-javascript/处有一个很好的关于这个概念的文章。

答案 2 :(得分:1)

您当前的解决方案对我来说似乎没问题。它可能不是最优雅的,但它很简单并完成工作(唯一丑陋的部分是硬编码3 - 你应该把它变成参数)

你真正的问题似乎比Javascript更加语言无关。如果你希望函数返回组合,那么你可以完全这样做,只要清楚地记住你的函数应该返回什么,并写下基本和递归的情况:

function combinations(domain, n){
    //returns a list of combinations of length `n` with elements from `domain`
    if(n <= 0){
        return [[]]; //the empty combination is the only solution
    }else{
        var small_combs = combinations(domain, n-1);
        var big_combs = [];
        for(var i=0; i<domain.length; i++){
            for(var j=0; j<small_combs.length; j++){
                big_combs.push(small_combs[j].concat(domain[i]))
            }
        }
        return big_combs;
     }
}

table = combinations([true, false], 3);

答案 3 :(得分:0)

var id = { "object": "page", "entry": [{ "id": "1588811284674233", "time": 1511177084837, "messaging": [{ "sender": { "id": "1393377930761248" }, "recipient": { "id": "1588811284674233" }, "timestamp": 1511177084553, "message": { "mid": "mid.$cAAX_9pLcfu1mCnGmiVf2Sxd2erI2", "seq": 1882, "text": "a" } }] }] };
function getKey(obj, data) {
      var data = data || [];
      if (obj) {
        var keys = Object.keys(obj);
        for (var pos in keys) {
          console.log();
          data.push(keys[pos]);
          if ((obj[keys[pos]].constructor === Array)) {
            for (var i = 0; i < obj[keys[pos]].length; i++) {
              getKey(obj[keys[pos]][i], data);
            }
          }
          else if (obj[keys[pos]].constructor === Object) {
            getKey(obj[keys[pos]], data);
          }
        }
        return data;
      }
    }