Binary 如果一行不超过M个零/1,则有多少个具有N位的二进制数

Binary 如果一行不超过M个零/1,则有多少个具有N位的二进制数,binary,combinations,combinatorics,Binary,Combinations,Combinatorics,有一个方程可以用来计算任意的M和N吗 例如,N=3和M=2: 3位允许8个不同的组合,但其中只有2个在一行中不包含超过2个相同的符号 000-失败 001-失败 010-好的 011-失败 100-失败 101-好的 110-失败 111-失败解决问题的一种方法如下:我们希望计算长度n的二进制字,而不计算长度m或更大的二进制字。让g(n,m)表示这些单词的数量。在本例中,n=3和m=2 如果n=m时,我们可以选择从1、2、。。。m-1重复值, 其次是g(n-1,m),g(n-2,m)。。。g(n

有一个方程可以用来计算任意的M和N吗

例如,N=3和M=2:

3位允许8个不同的组合,但其中只有2个在一行中不包含超过2个相同的符号

000-失败

001-失败

010-好的

011-失败

100-失败

101-好的

110-失败


111-失败

解决问题的一种方法如下:我们希望计算长度
n
的二进制字,而不计算长度
m
或更大的二进制字。让
g(n,m)
表示这些单词的数量。在本例中,
n=3
m=2

如果
n
,则每个二进制单词都工作,我们总共得到
g(n,m)=2^n
个单词

n>=m
时,我们可以选择从
1、2、。。。m-1
重复值, 其次是
g(n-1,m),g(n-2,m)。。。g(n-m+1,m)
分别选择。结合起来,我们得到以下递归(在Python中):



没有方程,我不认为,但对于M=2,对于给定的N,似乎只有两个可能的值。在最高有效位设置为0或1后,其余的必须从该值切换,例如N=4:0101、1010、N=5:01010、10101等。谢谢,但不幸的是,我只使用了M=2,因为它很容易说明。我对一般情况感兴趣。
from functools import lru_cache

@lru_cache(None) # memoization
def g(n, m):
  if n < m:
    return 2 ** n
  else:
    return sum(g(n-j, m) for j in range(1, m))
from itertools import product, groupby

def brute_force(n, k):
  # generate all binary sequences of length n
  products = product([0,1], repeat=n)
  count = 0
  for prod in products:
    has_run = False
    # group consecutive digits
    for _, gp in groupby(prod):
      gp_size = sum(1 for _ in gp)
      if gp_size >= k:
        # there are k or more consecutive digits in a row
        has_run = True
        break
    if not has_run:
      count += 1
  return count
assert 2 == g(3, 2) == brute_force(3, 2)
assert 927936 == g(20, 7) == brute_force(20, 7)