如何递归输出给定长度的0和1的置换?

时间:2018-11-19 14:50:23

标签: python python-3.x recursion permutation

我试图在Python中以递归方式打印0和1的排列。

我知道itertools中有一个置换函数,但想知道如何递归地完成它,例如

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

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

  

00
  01
  10
  11

输出始终为 k

如何使用print来递归地完成此任务?

5 个答案:

答案 0 :(得分:2)

在不遗漏代码的情况下,我将尝试为您提出所需的提示。

这个想法是要进行递归调用,以便向最初为空的累积字符串再增加一个数字。

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

您需要循环才能访问两个可能的数字。

让我知道这是否足以满足您的需求。

扰流板警报 (仅在尝试后才看下面):

  

enter image description here

答案 1 :(得分:2)

这是一个主意: 与其递归地执行此操作,不如使用数字的二进制展开:

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 :(得分:0)

您真的需要置换...吗? 如果不是,请尝试以下

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()

答案 3 :(得分:0)

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

#!/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)

答案 4 :(得分:0)

让我们保持简单:

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
>>>