如何将排列函数转换为惰性Generator?问题排查与修复咨询
生成器版排列函数无输出的原因及修复方案
问题原因
你的生成器函数无输出核心有两个问题:
- 递归生成器
rec被调用时,仅返回了生成器对象,但没有对其进行迭代,导致内部的yield cur.slice(0)从未触发执行。 - 外部生成器
permutations2只yield了rec(iList)返回的生成器对象本身,而非该生成器产出的每一个排列结果。
修复后的代码
function* permutations2(iList, maxLength) { const cur = Array(maxLength) function* rec(list, depth = 0) { if (depth === maxLength) { yield cur.slice(0) return // 提前返回,避免进入后续无意义循环 } for (let i = 0; i < list.length; ++i) { cur[depth] = list.splice(i, 1)[0] yield* rec(list, depth + 1) // 委托迭代递归生成器的结果 list.splice(i, 0, cur[depth]) } } yield* rec(iList) // 委托迭代递归生成器的所有产出值 }
关键改动说明
- 递归调用处使用
yield*:yield* rec(...)会自动迭代递归生成器的每一个产出值,把它们传递给上层生成器,确保每个排列结果都能被抛出。 - 外部生成器委托迭代:用
yield* rec(iList)替代原有的yield rec(iList),让外部生成器直接输出递归生成器的所有结果,而非输出生成器对象本身。 - 添加提前返回:在
depth === maxLength分支加入return,优化逻辑,避免进入后续循环。
测试调用示例
通过for...of循环迭代生成器获取结果:
for (const perm of permutations2([1, 2, 3], 2)) { console.log(perm) }
输出结果:
[1, 2] [1, 3] [2, 1] [2, 3] [3, 1] [3, 2]
内容的提问来源于stack exchange,提问作者Matan
相关产品推荐
相关产品推荐

