#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