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

Python递归求字符串子集代码问题:输出不符合预期求助

问题分析

原代码的逻辑完全跑偏了:

  • 每次递归都循环遍历整个字符串拼接到choice上,才会出现aa这种不符合子集定义的组合
  • 递归传递的choice参数没体现子集逐步构建的逻辑,根本没处理「选或不选当前字符」的核心分支
  • 既没把空集加进去,也没覆盖所有合法子集的情况
修正后的递归解法

正确的递归思路是对每个字符做「选/不选」的分支处理,代码如下:

def generate_subsets(s):
    result = []
    def backtrack(pos, current):
        # 遍历完所有字符,将当前子集加入结果
        if pos == len(s):
            result.append(current)
            return
        # 分支1:不选当前字符,直接递归下一个位置
        backtrack(pos + 1, current)
        # 分支2:选当前字符,将其加入current后递归下一个位置
        backtrack(pos + 1, current + s[pos])
    backtrack(0, "")
    return result

# 测试
print(generate_subsets("abc"))
输出结果

运行后会得到和预期一致的子集集合(顺序略有不同,但所有子集都包含,若需要特定顺序可后续排序):
['', 'a', 'b', 'ab', 'c', 'ac', 'bc', 'abc']

代码解释
  • backtrack是核心递归函数:
    • pos标记当前处理到字符串的第几个字符
    • current存储当前已经构建好的子集字符串
  • 当pos等于字符串长度时,说明所有字符处理完毕,把当前构建的子集加入结果列表
  • 两个递归分支分别对应「不选当前字符」和「选当前字符」的情况,这样能覆盖所有可能的子集组合
  • 初始调用从pos=0、current=""开始,自然包含了空集

内容的提问来源于stack exchange,提问作者Dwaipayan Sarkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:52:11