Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.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 ES6使用生成器函数对列表进行分区_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript ES6使用生成器函数对列表进行分区

Javascript ES6使用生成器函数对列表进行分区,javascript,ecmascript-6,Javascript,Ecmascript 6,我试图将在from Python中找到的函数移植到ES6(不需要排序),但无法复制相同的输出 与在Python版本中只返回给定长度的分区不同,它当前返回的是所有达到并包括该长度的分区 在下面的示例中,所需的输出是仅返回长度为3的数组 我是否误解了发电机功能的某些方面 const kPartitions=(seq,k)=>{ 常数n=序列长度 变量组=[] 函数*生成部分(i){ 如果(i>=n){ 产量组.map(组=>[…组]) } 否则{ if(n-1>k组长度){ for(让组中的组){

我试图将在from Python中找到的函数移植到ES6(不需要排序),但无法复制相同的输出

与在Python版本中只返回给定长度的分区不同,它当前返回的是所有达到并包括该长度的分区

在下面的示例中,所需的输出是仅返回长度为3的数组

我是否误解了发电机功能的某些方面

const kPartitions=(seq,k)=>{
常数n=序列长度
变量组=[]
函数*生成部分(i){
如果(i>=n){
产量组.map(组=>[…组])
}
否则{
if(n-1>k组长度){
for(让组中的组){
分组推送(序号[i])
产量*发电比例(i+1)
group.pop()
}
}
if(组长度}
不,只是从Python到ES6的转换中出现了一个错误

在有
if(n-1>k-groups.length)
的行中,
1
应该是
i
(只是一个转录错误)

因此,该行的正确版本是:

if (n - i > k - groups.length)
一旦更改,它将提供预期输出:

[["A", "B"], ["C"], ["D"]]
[["A", "C"], ["B"], ["D"]]
[["A"], ["B", "C"], ["D"]]
[["A", "D"], ["B"], ["C"]]
[["A"], ["B", "D"], ["C"]]
[["A"], ["B"], ["C", "D"]]
现在我有兴趣深入研究,看看它到底是如何工作的;)


以下是所做更改的完整代码:

const kPartitions = (seq, k) => {
  const n = seq.length
  var groups = []
  function* generatePartitions(i) {
    if (i >= n) {
      yield groups.map(group => [...group])
    }
    else {
      if (n - i > k - groups.length) {
        for (let group of groups) {
          group.push(seq[i])
          yield* generatePartitions(i + 1)
          group.pop()
        }
      }
      if (groups.length < k) {
        groups.push([seq[i]])
        yield* generatePartitions(i + 1)
        groups.pop()
      }
    }
  }
  return generatePartitions(0)
}

for (var partitions of kPartitions(['A', 'B', 'C', 'D'], 3)) {
  console.log(partitions)
}
const kPartitions=(seq,k)=>{
常数n=序列长度
变量组=[]
函数*生成部分(i){
如果(i>=n){
产量组.map(组=>[…组])
}
否则{
if(n-i>k-groups.length){
for(让组中的组){
分组推送(序号[i])
产量*发电比例(i+1)
group.pop()
}
}
if(组长度
Argh,非常感谢。该算法在链接的帖子中得到了很好的解释。