生成行中没有 2 个零或 3 个 1 的二进制序列
Generate binary sequence without 2 zeros OR 3 1's in the row
我的作业任务是生成二进制序列(样本输入在 1<=n<=30 范围内),不包含两个零或三个一。我制作了简单的二进制生成器,其工作原理如下所示。我需要修改它以获得此输出(并且还根据输出):
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<=n<=30)。有什么想法吗?
P.S。我必须在不使用 itertools 的情况下完成它。避免 itertools 是任务的一部分。
只需在循环中添加两个下一个 if-s。
这些 if-s 字面意思是接下来的事情:
- 如果您当前的数字已经以 0 开头,请不要在前面添加下一个 0,否则您会在开头得到两个或更多相邻的 0,这与任务背道而驰。
- 如果您当前的数字已经以 11 开头,请不要在前面添加下一个 1,否则您会在开头得到三个或更多相邻的 1,这也是违背任务的。
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
我的作业任务是生成二进制序列(样本输入在 1<=n<=30 范围内),不包含两个零或三个一。我制作了简单的二进制生成器,其工作原理如下所示。我需要修改它以获得此输出(并且还根据输出):
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<=n<=30)。有什么想法吗?
P.S。我必须在不使用 itertools 的情况下完成它。避免 itertools 是任务的一部分。
只需在循环中添加两个下一个 if-s。
这些 if-s 字面意思是接下来的事情:
- 如果您当前的数字已经以 0 开头,请不要在前面添加下一个 0,否则您会在开头得到两个或更多相邻的 0,这与任务背道而驰。
- 如果您当前的数字已经以 11 开头,请不要在前面添加下一个 1,否则您会在开头得到三个或更多相邻的 1,这也是违背任务的。
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