【问题标题】:What is the best way to generate all binary strings of the given length in Python using Recursion?使用递归在 Python 中生成所有给定长度的二进制字符串的最佳方法是什么?
【发布时间】:2021-03-01 13:06:45
【问题描述】:

我现在正在研究递归并尝试构建一些代码来生成给定长度“n”的所有二进制字符串。 我找到了一个用于循环的代码:

n = 5
for i in range(2**n, 2**(n+1)):
    print(bin(i)[3:])

但是有没有其他方法可以使用递归来解决这个问题? 谢谢!

【问题讨论】:

  • 你能分享一些示例输入和输出吗?
  • 如果 input = 2 输出应该是 00, 01, 10, 11

标签: python algorithm recursion binary


【解决方案1】:

很难确定哪种方式是“最好的”;)

我们必须将零或一添加到当前字符串并进入下一个递归级别。

停止条件达到所需长度(此处为n-1,因为我们必须提供与您的示例相对应的前导)

def genbin(n, bs = ''):
    if n-1:
        genbin(n-1, bs + '0')
        genbin(n-1, bs + '1')
    else:
        print('1' + bs)

genbin(4)

1000
1001
1010
1011
1100
1101
1110
1111

【讨论】:

  • 这个解决方案缺少一半的输出字符串,那些以0! 开头的字符串!
  • @joanis 你见过范围为 2**n, 2**(n+1) 的作者代码吗?这假定没有前导零,这就是为什么我在 else 分支(前导数字)中添加“1”
  • OP 反驳说,可能是他们自己的问题,在问题下的 cmets 中,然后,因为他们说“如果输入 = 2,输出应该是 00,01,10,11”。应该编辑问题以将该评论纳入问题。
  • @joanis 生成带有前导零的序列的代码没有问题,但我确实回答了提出的问题。
  • 是的,我现在明白了。他们显示的代码和评论确实相互矛盾。你比我读的更仔细!
【解决方案2】:

详细阐述Harish并生成字符串列表

def generate_binary_strings(bit_count):
    binary_strings = []
    def genbin(n, bs=''):
        if len(bs) == n:
            binary_strings.append(bs)
        else:
            genbin(n, bs + '0')
            genbin(n, bs + '1')


    genbin(bit_count)
    return binary_strings

binary_strings = generate_binary_strings(6)
print(binary_strings)

【讨论】:

  • 根据我刚刚跑的时间,这是所有答案中显示的最快的解决方案。
【解决方案3】:
def getbin(n, s=['']):
    if n > 0:
        return [
            *getbin(n - 1, [i + '0' for i in s]),
            *getbin(n - 1, [j + '1' for j in s])
        ]
    return s

【讨论】:

  • 这可行,但您是否验证过这是否比其他解决方案更快或更好。您将在内存中制作更多部分列表的副本,我有兴趣比较性能。
  • 好点。我快速比较了运行时,它显然比 lode 的解决方案慢
  • 是的,我刚刚做了一些比较,lode 是最快的,而你的慢了大约 2 倍。
  • 我想无论如何我都会分享这种方法(另外,OP 并没有强调小运行时)。
  • 是的,它有点慢,但很高兴看到解决同一问题的不同方法。谢谢你的回答。
【解决方案4】:

MBo 给出的答案没有给出输入 2 和 3 的正确答案。

例如。 输入:2

输出应该是:

0 0

0 1

1 0

1 1

输入:3

输出应该是:

0 0 0

0 0 1

0 1 0

0 1 1

1 0 0

1 0 1

1 1 0

1 1 1

我修改了相同的代码如下

def genbin(n, bs=''):
if len(bs) == n:
    print(bs)
else:
    genbin(n, bs + '0')
    genbin(n, bs + '1')


genbin(3)


000
001
010
011
100
101
110
111

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 2010-10-19
    • 2011-12-04
    • 2012-10-23
    • 2020-02-08
    • 2010-10-25
    • 1970-01-01
    • 2021-02-09
    • 2010-10-28
    相关资源
    最近更新 更多