You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将排列函数转换为惰性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) // 委托迭代递归生成器的所有产出值
}

关键改动说明

  1. 递归调用处使用yield*:yield* rec(...)会自动迭代递归生成器的每一个产出值,把它们传递给上层生成器,确保每个排列结果都能被抛出。
  2. 外部生成器委托迭代:用yield* rec(iList)替代原有的yield rec(iList),让外部生成器直接输出递归生成器的所有结果,而非输出生成器对象本身。
  3. 添加提前返回:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:45:42