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
相关产品推荐
相关产品推荐

