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

求实现输入(n,r)生成递增二进制序列的组合枚举函数

实现n选r的二进制组合序列(递增)

你的思路方向是对的——通过移动二进制中的1位来生成下一个组合,核心是找到最右侧可以左移且不与左边1碰撞的1位,然后将右侧的1全部重置到最右端。下面是具体的可运行实现步骤和代码:

核心逻辑拆解

  1. 初始状态:生成最小编号的二进制串,也就是r个1全部在最右侧,比如n=5,r=2就是00011。
  2. 生成下一个组合:
    • 从右往左遍历,找到第一个满足「当前位是1,且左边相邻位是0」的位置,记为pos。
    • 将pos位的1左移一位(把pos位设为0,pos-1位设为1)。
    • 统计pos右侧原本的1的数量(记为count),然后把pos右侧的所有位重置为:末尾count个1,其余为0。
  3. 终止条件:当找不到可移动的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:53:12