【问题标题】:How to get a list of all binary numbers of length n?如何获取长度为 n 的所有二进制数的列表?
【发布时间】:2021-04-06 10:33:22
【问题描述】:

我正在尝试编写一些递归 python 代码来打印每个长度为 n 的二进制数。函数的输入只能是 n。到目前为止,这是我的代码:

def printAll(n):
    result=[]
    stringSoFar=''
    def printAllrec(stringSoFar,n,result):
        if n ==0:
            result.append(stringSoFar)
            if len(result) == (2):
                return result
        else:
            printAllrec((stringSoFar+"0"),n-1,result)
            printAllrec((stringSoFar+"1"),n-1,result)

    return printAllrec(stringSoFar,n,result)
print(printAll(2))

但是,此代码一直返回“无”。我不明白为什么它不起作用。任何提示将不胜感激。

【问题讨论】:

    标签: python python-3.x list recursion permutation


    【解决方案1】:

    你的代码不需要更多的returns,它需要返回正确的东西。 printAllrec 在这里不使用 返回值,它只是修改了提供给顶层printAllrec 调用的list,该调用委托给子调用。但是顶级函数printAll 需要返回list,而不是内部递归函数的垃圾返回。只需更改:

    def printAll(n):
        ...
    
        return printAllrec(stringSoFar,n,result)
    

    到:

    def printAll(n):
        ...
        printAllrec(stringSoFar,n,result)
        return result  # returns the actual list
    

    Try it online!

    它按预期工作。

    【讨论】:

    • @userj:旁注:这不需要使用递归解决方案或导入模块。 def allbin(n): return [f'{i:0{n}b}' for i in range(1 << n)] 足以实现预期目标。所有长度为n 的位串的集合可以通过计数找到(f 字符串只是将其格式化为二进制并用零填充),range 非常方便。
    【解决方案2】:

    使用递归生成器可以使代码更加紧凑。您只需要从 n-1 中获取每个结果并附加一个“0”和一个“1”。

    def allBits(n):
        if n: yield from ( bits+bit for bits in allBits(n-1) for bit in ("0","1") )
        else: yield ""
    
    for bits in allBits(3):print(bits)
    
    000
    001
    010
    011
    100
    101
    110
    111
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 2023-04-03
      • 1970-01-01
      • 2023-04-10
      • 2021-02-22
      • 1970-01-01
      相关资源
      最近更新 更多