Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在递归函数中,结果存储在哪里?_Javascript_Arrays_Recursion_Boolean_Return Value - Fatal编程技术网

Javascript 在递归函数中,结果存储在哪里?

Javascript 在递归函数中,结果存储在哪里?,javascript,arrays,recursion,boolean,return-value,Javascript,Arrays,Recursion,Boolean,Return Value,我目前正试图让JavaScript为布尔函数生成一个真值表。给定一个函数,代码应该只列出所有可能的布尔组合,并从每个组合中输出函数 至于生成所有组合,我将其放在一起简化为组合代码: var table = []; function combinations(current) { var current = current || []; if(current.length === 3) { table.push(current); } else {

我目前正试图让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时,它将结果记录推送到表中。然而,我想知道这是否是存储递归函数结果的推荐方法

我面临在递归函数中使用return的建议,但是如何实现这样的事情呢?也就是说,如果最终的组合必须返回一个包含所有元素的数组,那么如何实现呢?当然,我可以在最后使用return table,但实际上我正在寻找一种在函数内部完成这一切的方法,而不需要像现在这样的外部变量


那么,如何使组合以数组形式返回结果而不使用外部变量?

为了避免污染全局空间,可以使用闭包来包含递归函数。这个概念在。

中有一篇很好的文章,为了避免污染全局空间,您可以使用闭包来包含递归函数。在。

使用中有一篇关于这个概念的优秀著作

要优雅得多,不是吗

使用

要优雅得多,不是吗


我觉得你目前的解决办法很好。它可能不是最优雅的,但它很简单,并且可以完成任务唯一难看的部分是硬编码的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-您应该将其转换为参数

你真正的问题似乎比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);

不需要使用此构造来封装结果。请参阅我的答案。我将使用改为可用于表示这只是一个选项。@jsumners链接为dead@Dropout我喜欢人们重新组织而不创建302。不需要使用这个结构来封装结果。请参阅我的答案。我将使用改为可用于表示这只是一个选项。@jsumners链接为dead@Dropout我喜欢人们重新组织而不是创造302。谢谢。不过有些反馈-你在j循环中检查i。另外,在JavaScript中int不存在,arr+arr不可能,但我理解你的意思。谢谢。不过有些反馈-你在j循环中检查i。另外,在JavaScript中int不存在,arr+arr不可能,但我理解你的意思。
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;
      }
    }