【问题标题】:How to output permuations of 0's and 1's of a given length recursively?如何递归地输出给定长度的 0 和 1 的排列?
【发布时间】:2019-04-21 23:02:20
【问题描述】:

我正在尝试在 Python 中递归打印 0 和 1 的排列。

我知道 itertools 中有一个排列函数,但想知道如何递归地执行它,例如

function name is print_01(k) 
    # ...
    print(permutation)
    # ...

...其中 k 是要打印的每个排列的长度,因此如果将其称为 print_01(2),则输出将是这样的:

00
01
10
11

输出的长度总是k

我如何使用print 递归地完成这项工作?

【问题讨论】:

  • 由于(最大)递归深度,我不确定使用递归是否是个好主意......

标签: python python-3.x recursion permutation


【解决方案1】:

这是一个想法: 不要递归地这样做,而是使用数字的二进制开发:

def print_01(k):
    end = 1<<k   #this is the integer with binary developpement 1 followed by k zeros
    for j in range(end): # iterate until end means getting all k - 0-1 combinations
        comb = bin(j)[2:].zfill(k)
        print [int(x) for x in comb]

【讨论】:

    【解决方案2】:

    在不泄露代码的情况下,我将尝试为您提供编写代码所需的提示。

    这个想法是进行递归调用以向累积的字符串添加一个数字,该字符串最初是空的。

    所谓的递归“基本情况”是累积字符串具有所需长度的情况。这是您将其输出(或将其存储在某处)的地方

    您需要一个循环来访问这两个可能的数字。

    让我知道这是否足以让您继续前进。

    剧透警告(尝试后才看下面):

    【讨论】:

    • 感谢您发布该代码,是否有链接可以让我了解 for 循环的工作原理?
    • 循环只是遍历字符串“01”,依次获取每个字符。所以digit 将首先是“0”,在第二次(最后一次)迭代中它将是“1”
    【解决方案3】:

    你真的需要置换...吗? 如果不试试下面

    def print_01(length):
        for i in range(1 << length):
            print(format(i, '0{}b'.format(length)))
    
    
    def main():
        '''The Main'''
        print_01(2)
        print_01(3)
    
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

      【解决方案4】:

      这是一个简单的递归版本:

      #!/usr/bin/python -E
      #string of binary 1s and 0s, all possible combinations for a given length
      def swap(string, loc, val):
          newstring = string[:loc]+val+string[loc+1:]
          return newstring
      def printperms(string,n):
          length = len(string)
          if n > 0:
             string = swap(string, (length - n), "0")
             printperms(string, (n -1))
             string = swap(string, (length - n), "1")
             printperms(string, (n -1))
          else:
             print(string)
      
      
      mystring = "000"
      length = len(mystring)
      printperms(mystring, length)
      mystring = mystring+" "
      print("############################################")
      printperms(mystring,length+1)
      

      【讨论】:

        【解决方案5】:

        让我们保持简单:

        def print_01(bits, n=0):
            if n.bit_length() <= bits:
                print('{:0{}b}'.format(n, bits))
                print_01(bits, n + 1)
        

        int 类型有一个方法bit_length(),它告诉你表示这个数字所需的最小二进制字符数——我们用它来控制。嵌套格式允许我们将输出宽度作为变量传递。

        用法

        >>> print_01(3)
        000
        001
        010
        011
        100
        101
        110
        111
        >>> 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多