【问题标题】:Generate binary sequence without 2 zeros OR 3 1's in the row生成行中没有 2 个零或 3 个 1 的二进制序列
【发布时间】:2020-10-10 16:16:02
【问题描述】:

我的作业任务是生成没有两个零或三个一的二进制序列(范围为 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

附:我必须在不使用 itertools 的情况下做到这一点。避免使用 itertools 是任务的一部分。

【问题讨论】:

  • 您可以使用广度优先搜索或深度优先搜索的回溯。
  • 请从intro tour 重复on topichow to ask。 “告诉我如何解决这个编码问题?”与 Stack Overflow 无关。您必须诚实地尝试解决方案,然后就您的实施提出具体问题。二进制生成器可在线免费获得...您的在哪里为手头的问题付出了努力?
  • 我发现的二进制生成器不能解决我的问题,或者我无法理解其他解决方案。我提到我尝试了列表方法和 if 语句,但失败了。我是 CS 和算法理论的新手,所以,如果我的问题很原始,我真的很抱歉!

标签: python algorithm recursion combinatorics


【解决方案1】:

只需在循环中添加两个下一个 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

【讨论】:

  • 非常感谢!看起来真的很容易。很遗憾我自己没有意识到这一点。
【解决方案2】:

@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2022-11-19
    • 2022-01-06
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多