我正在尝试移植在 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/