【问题标题】:How to generate all possible binary sequences of a set length --given set portions of the sequence如何生成设定长度的所有可能的二进制序列——给定序列的集合部分
【发布时间】:2020-11-19 04:47:22
【问题描述】:

这开始是练习一些 Python 编程的简单练习,但我无法修复我的逻辑缺陷!

目标很简单。给定一个预定大小的数组,我需要构建数组大小的所有可能的二进制排列。另一个复杂的问题是,特定的数组索引已经设置,因此无需生成多个排列。

举个具体的例子:

n=3
arr = [None]*n
arr[0] = 0

二进制排列的结果列表应该是:[0, 0, 0],[0, 0, 1],[0, 1, 0],[0, 1, 1]

我的代码正在返回:[0, 0, 0],[0, 0, 1],[0, 1, 1]

所以我可以清楚地看到它没有创建进一步的排列(因为这个问题只会随着更大的数组大小而加剧)。不幸的是,我不明白为什么它没有生成最后一个排列。

这是我用来生成和打印二进制字符串的代码:

def arrayPrint(arr, n):  
  
    for i in range(0, n):  
        print(arr[i], end=" ")  
      
    print() 

def binaryStringGen(n, arr, i): 

    if i == n: 
        arrayPrint(arr, n) 
        return
    
    if (arr[i] == None):
        arr[i] = 0
        binaryStringGen(n, arr, i + 1) 

        arr[i] = 1
        binaryStringGen(n, arr, i + 1)
    else:
        binaryStringGen(n, arr, i + 1) 

任何帮助理解这一点将不胜感激!

【问题讨论】:

    标签: arrays python-3.x binary


    【解决方案1】:

    您必须在 else 分支之前添加 arr[i] = None

        if (arr[i] == None):
            arr[i] = 0
            binaryStringGen(n, arr, i + 1) 
    
            arr[i] = 1
            binaryStringGen(n, arr, i + 1)
            arr[i] = None  #  <= add this
    

    否则当您从binaryStringGen 回溯,然后再次调用binaryStringGen 时,使用相同的i 值,arr[i] 仍将设置为 1,您的代码将进入 else 分支。

    更一般地,当您编写对参数有副作用的递归函数时,请确保在函数终止后正确设置这些函数。

    【讨论】:

    • 感谢您的帮助和进一步的澄清!我将通过编写适当的递归函数来练习更多,以更好地实现这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2022-12-07
    • 2014-12-25
    相关资源
    最近更新 更多