求实现输入(n,r)生成递增二进制序列的组合枚举函数
实现n选r的二进制组合序列(递增)
你的思路方向是对的——通过移动二进制中的1位来生成下一个组合,核心是找到最右侧可以左移且不与左边1碰撞的1位,然后将右侧的1全部重置到最右端。下面是具体的可运行实现步骤和代码:
核心逻辑拆解
- 初始状态:生成最小编号的二进制串,也就是r个1全部在最右侧,比如n=5,r=2就是
00011。 - 生成下一个组合:
- 从右往左遍历,找到第一个满足「当前位是1,且左边相邻位是0」的位置,记为
pos。 - 将
pos位的1左移一位(把pos位设为0,pos-1位设为1)。 - 统计
pos右侧原本的1的数量(记为count),然后把pos右侧的所有位重置为:末尾count个1,其余为0。
- 从右往左遍历,找到第一个满足「当前位是1,且左边相邻位是0」的位置,记为
- 终止条件:当找不到可移动的1位时(即二进制串变成r个1全部在最左侧),停止生成。
Python 实现代码
def generate_binary_combinations(n, r): if r == 0 or r > n: return [] # 初始化二进制列表,用列表方便位操作,初始状态为最后r个1 bits = [0]*(n - r) + [1]*r result = [] # 转换为字符串加入结果集 result.append(''.join(map(str, bits))) while True: # 从右往左找第一个可左移的1位 pos = -1 for i in range(n-2, -1, -1): if bits[i] == 0 and bits[i+1] == 1: pos = i+1 break # 找不到说明已生成所有组合 if pos == -1: break # 左移目标1位 bits[pos] = 0 bits[pos-1] = 1 # 统计目标位右侧的1数量 right_ones_count = sum(bits[pos:]) # 重置右侧位:先全0,再把最后right_ones_count位设为1 bits[pos:] = [0]*(n - pos - right_ones_count) + [1]*right_ones_count # 转换为字符串加入结果 result.append(''.join(map(str, bits))) return result # 测试示例 print(generate_binary_combinations(5, 2))
原代码可能失败的常见原因
大概率是这两个细节没处理到位:
- 遍历顺序错误:必须从右往左找可移动的1位,若从左往右找会跳过更小的组合,导致序列不递增。
- 右侧位重置错误:重置时要保证右侧的1全部集中在最右端,而不是随意放置,否则会生成不符合要求的二进制串。
运行上述代码,输入(5,2)会得到你需要的结果:
['00011', '00101', '00110', '01001', '01010', '01100', '10001', '10010', '10100', '11000']
内容的提问来源于stack exchange,提问作者Ultra
相关产品推荐
相关产品推荐

