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

标签 javascript ecmascript-6

我正在尝试移植在 this answer 中找到的函数从 Python 到 ES6(减去我不需要的排序),但无法重现相同的输出。

与在 Python 版本中仅返回给定长度的分区不同,它目前返回所有分区,直至并包括该长度。

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

我是否误解了生成器函数的某些方面?

const kPartitions = (seq, k) => {
  const n = seq.length
  var groups = []
  function* generatePartitions(i) {
    if (i >= n) {
      yield groups.map(group => [...group])
    }
    else {
      if (n - 1 > 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)
}

也为 a bin .

最佳答案

不,只是在从 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)
}

关于javascript - ES6 使用生成器函数对列表进行分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48453834/

相关文章:

javascript - 从回调更新 React 组件状态

javascript - Vuex 在组件中获取突变后的状态

javascript - jQuery - Mouseenter/Mouseleave 父/子问题

node.js - 如果不将服务器 uri 传递给客户端的 io(),则无法使用 SocketIO

javascript - 在 Visio Web Access ASPX 中自动缩放以适合

javascript - Angular js - 单击按钮将数据添加到现有模型

javascript - 理解迭代器协议(protocol)

javascript - 将外部库与 HyperHTML 结合使用

javascript - 将json转换为其他json结构

javascript - 如何从同一个类方法中调用一个类方法?