生成没有2个零或3个1的二进制序列

问题描述

我的作业任务是生成二进制序列(范围为1

n = int(input())
def gen(n):
    if n == 0:
        return ['']
    l = gen(n-1)
    start0 = []
    start1 = []
    for seq in l:
        start0.append('0' + seq)
        start1.append('1' + seq)
    return start0 + start1
l1 = gen(n)
for elem in l1:
    print(elem)
Sample Input

4
Sample Output(which I have right Now)

0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
Sample Output I need to obtain:
0101
0110
1010
1011
1101

为简单起见,应排除类似1000、1110、1100、0011、0111等序列(连续两个零或三个三个1)。为此尝试了列表方法,但是我无法在所有范围(1

P.S。我必须不使用itertools来做。避免itertools是任务的一部分。

解决方法

只需将两个下一个if-s添加到循环中即可。

这些if-s字面意思是接下来的事情:

  1. 如果您当前的数字已经以0开头,则不要在下一个0之前添加前缀,否则,您将在开头获得两个或多个相邻的0,这与任务相反。
  2. 如果您当前的数字已经以11开头,则不要在下一个1之前加上前缀,否则在开始时会得到三个或更多相邻的1,这也与任务相反。

Try it online!

n = int(input())
def gen(n):
    if n == 0:
        return ['']
    l = gen(n-1)
    start0 = []
    start1 = []
    for seq in l:
        if not seq.startswith('0'):
            start0.append('0' + seq)
        if not seq.startswith('11'):
            start1.append('1' + seq)
    return start0 + start1
l1 = gen(n)
for elem in l1:
    print(elem)

输入4的输出:

0101
0110
1010
1011
1101

输入5的输出:

01010
01011
01101
10101
10110
11010
11011
,

@Arty根据要求回答。这是另一个解决方案的生成器示例:

def gen(n):
    if n == 1:
        yield from '01'
    else:
        for seq in gen(n-1):
            if not seq.endswith('0'):
                yield seq + '0'
            if not seq.endswith('11'):
                yield seq + '1'

n = int(input('Bits? '))
for elem in gen(n):
    print(elem)

输出:

Bits? 8
01010101
01010110
01011010
01011011
01101010
01101011
01101101
10101010
10101011
10101101
10110101
10110110
11010101
11010110
11011010
11011011