Как получить список всех двоичных чисел длины n?

#python #python-3.x #list #recursion #permutation

#питон #python-3.x #Список #рекурсия #перестановка

Вопрос:

Я пытаюсь написать некоторый рекурсивный код 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))

 

Однако этот код продолжает возвращать ‘None’. Я не понимаю, почему это не сработает. Любые советы будут с благодарностью приняты.

Ответ №1:

Вашему коду не нужно больше return s, он должен возвращать правильную вещь. printAllrec здесь не используются возвращаемые значения, он просто изменяет list предоставленный printAllrec вызов верхнего уровня, который делегируется дочерним вызовам. Но функция верхнего уровня, printAll , должна возвращать это list , а не мусор, возвращаемый из внутренней рекурсивной функции. Просто измените:

 def printAll(n):
    ...

    return printAllrec(stringSoFar,n,result)
 

Для:

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

Попробуйте онлайн!

и это работает так, как ожидалось.

Комментарии:

1. @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