Javascript ES6使用生成器函数对列表进行分区
我试图将在from Python中找到的函数移植到ES6(不需要排序),但无法复制相同的输出 与在Python版本中只返回给定长度的分区不同,它当前返回的是所有达到并包括该长度的分区 在下面的示例中,所需的输出是仅返回长度为3的数组 我是否误解了发电机功能的某些方面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(让组中的组){
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,非常感谢。该算法在链接的帖子中得到了很好的解释。