当前位置: 首页 > 知识库问答 >
问题:

我如何在一个递归javascript函数中把数组推到数组中,这样当它完成时我就可以使用它了?

云洋
2023-03-14

我想这是第一个问题。如果需要更多信息,请告诉我,以便你们帮助我。

所以我试着用javascript实现一个使用递归函数的算法。

该函数是从JavaScript中实现置换堆算法复制的,如下所示:

let swap = function(array, index1, index2) {
    let temp = array[index1]
    array[index1] = array[index2]
    array[index2] = temp
    return array
}

let permutationHeap = (array, result, n) => {
    n = n || array.length // set n default to array.length
    if (n === 1) {
        result(array)
    } else {
        for (let i = 1; i <= n; i++) {
            permutationHeap(array, result, n - 1)
            if (n % 2) {
                swap(array, 0, n - 1) // when length is odd so n % 2 is 1,  select the first number, then the second number, then the third number. . . to be swapped with the last number
            } else {
                swap(array, i - 1, n - 1) // when length is even so n % 2 is 0,  always select the first number with the last number
            }
        }
    }
}


let output = function(input) {
    console.log(output)
}

permutationHeap([1,2,3,4,5], output)

输出函数(回调?)中的console.log给了我正确的输出。如果我将console.log移动到置换堆函数中的if语句下方,我也会得到正确的输出(console.log(数组),在这种情况下)。

我想做的是将每个输出存储为一个数组,在一个数组中,我以后可以使用它。我猜我正在努力学习Javascript 101。处理异步思维。但我一辈子都搞不懂如何得到数组

    < li >如果我在permutationHeap-函数和。push(array)它只存储[1,2,3,4,5]。如果我在输出函数中做同样的事情,结果是一样的。 < li >我还尝试将一个空数组传递给permutationHeap-函数,并以这种方式进行推送。仍然没有运气。

有人愿意为一个可能超级无聊的问题发光吗?:)非常感谢!

共有2个答案

郁灿
2023-03-14

我想我已经通过使用生成器和yield成功修复了你的代码。虽然我不能确切地解释它...

js prettyprint-override">var swap = function(array, index1, index2) {
    let temp = array[index1]
    array[index1] = array[index2]
    array[index2] = temp
    return array
}

var permutationHeap = function*(array, result, n) {
    n = n || array.length // set n default to array.length
    if (n === 1) {
        yield (array.slice(0))
    } else {
        for (let i = 1; i <= n; i++) {
            yield* permutationHeap(array, result, n - 1)
            if (n % 2) {
                swap(array, 0, n - 1) // when length is odd so n % 2 is 1,  select the first number, then the second number, then the third number. . . to be swapped with the last number
            } else {
                swap(array, i - 1, n - 1) // when length is even so n % 2 is 0,  always select the first number with the last number
            }
        }
    }
}

var x = permutationHeap([1,2,3,4,5])
var results = Array.from(x);
console.log(results);
万俟光临
2023-03-14

实际上,我在之前的答案中打破了算法,因为通过重复数组不断迭代,我打破了算法中依赖数组随时间变化的部分。

我已经做出了一个答案,它使用您最初更有效地使用的代码:

var swap = function(array, index1, index2) {
  var temp = array[index1];
  array[index1] = array[index2];
  array[index2] = temp;
  return array;
};

var permutationHeap = function(array, result, n) {
  n = n || array.length; // set n default to array.length
  if (n === 1) {
    result(array);
  } else {
    for (var i = 1; i <= n; i++) {
      permutationHeap(array, result, n - 1);
      if (n % 2) {
        swap(array, 0, n - 1); // when length is odd so n % 2 is 1,  select the first number, then the second number, then the third number. . . to be swapped with the last number
      } else {
        swap(array, i - 1, n - 1); // when length is even so n % 2 is 0,  always select the first number with the last number
      }
    }
  }
};

function getPermutations(array) {
  var results = [];
  var output = function(res) {
    results.push(res.slice(0));
  }

  permutationHeap(array, output);

  return results;
}

var permutations = getPermutations([1,2,3]);
console.log(permutations);
 类似资料:
  • 我建立了一个连接到两个集合并将其存储在两个数组中,但我无法访问它,因为它是异步的。 此外,我还想执行类似于从学生中选择滚动的操作 db.student.find({},{roll:1,_id:0}); 但实现这一点并不奏效,它只是从集合中获取所有内容。 我试过使用Async/Await,但它不起作用。 我尝试实现async(npm模块),并使用async.Series方法,但没有成功。 对cons

  • 这是我的主要方法,我正在努力重新学习编码,因为我在学校里多次失败。我想从主方法中获取一个数组,并从循环中获取用户输入,然后将其传递给“TestScoresTwo.java”类中的构造函数。然后我想取那个数组,用它来求和,在类中的一个方法中找到平均值,然后返回和。 这是我的测试分数。java类。 当它编译时,我的输出是:“请输入等级数量有”3“输入等级11”等级是11.0“50”等级是50.0“70

  • 问题内容: 即使在不同的浏览器中,此代码也始终有效: 但是,我找不到关于为什么它应该起作用的单一参考。我首先在John Resig的演示文稿中看到了这一点,但仅被提及。那里或任何地方都没有解释。 有人可以启发我吗? 问题答案: 该声明是魔术,使它的标识符在代码块*中的任何内容执行之前就被绑定了。 这与带有表达式的赋值不同,后者以正常的自上而下的顺序求值。 如果将示例更改为说: 它将停止工作。 函数

  • 如何创建一个函数,该函数将整数数组和数组长度作为参数,如果数组元素的和为偶数,则返回true,否则返回false? 如何在不使用任何静态变量的情况下执行此操作? 我尝试过制作一个代码来检查当前是否为奇数,而前一个是偶数将递归返回 false,否则将递归返回 true,这个想法是基于数学公理,即只有偶数加奇数等于奇数,其他所有组合都是偶数。

  • 然后我尝试了这种方法:1)为H2控制台部署一个预构建的WAR文件:https://www.cs.hs-rm.de/~knauf/javaee6/kuchen/h2console.war) 2)打开URL http://localhost:8080/h2console/h2 3)用户名/密码=“sa”登录 看看greeter应用程序添加的数据。运行以下SQL命令: 我试过了,但得到的信息 找不到表“

  • 我更新一些值作为一个javascript内我的在像下面这样。 这是更新之前的对象 这就是我要更新它的方式, 因此,这给了我一个错误,state.lastValue.push不是一个函数。但如果我像下面这样做就好了, 这很好。什么原因。