Python 如何使用递归获得2个值?
我正在尝试构建一个可以打印所有二进制序列的代码 比如说,Python 如何使用递归获得2个值?,python,Python,我正在尝试构建一个可以打印所有二进制序列的代码 比如说, n=2 output: 00 01 10 11 我的逻辑是将“0”添加到开始输出的前一半,并将“1”添加到另一半,依此类推。 但是我在用递归返回2个值时遇到了麻烦 这就是我试着写的: def binary(prefix='',n): if n==0: return prefix else: for i in range(2): if i==0:
n=2
output:
00
01
10
11
我的逻辑是将“0”添加到开始输出的前一半,并将“1”添加到另一半,依此类推。
但是我在用递归返回2个值时遇到了麻烦
这就是我试着写的:
def binary(prefix='',n):
if n==0:
return prefix
else:
for i in range(2):
if i==0:
return ('0'+binary(prefix,n-1))
if i==1:
return ('1'+binary(prefix,n-1))
您可以使用
itertools
:
from itertools import product, repeat
for i in product(*repeat('01', n)):
print(''.join(i))
然后,您的函数将类似于:
def binary(n):
return [''.join(comb) for comb in product(*repeat('01', n))]
您可以编写一个生成器:
def binary(n):
if n==0:
yield ''
else:
for i in range(2):
for item in binary(n-1):
yield ('0' if i==0 else '1')+item
list(binary(3)) # ['000', '001', '010', '011', '100', '101', '110', '111']
注意:我删除了前缀,因为您的代码返回了后缀。如果需要包装器函数,请添加该函数
您还可以使用itertools模块:
[''.join(item) for item in itertools.product(*['01' for _ in range(n)])]
这可能就是您想要做的:
def recursive_get_bin_str(s, n):
if n == 0:
print s
else:
for digit in '01':
recursive_get_bin_str(s + digit, n - 1)
使用return的递归将不起作用,因为该函数将只返回一个值,并且您需要多个值。如果试图返回多个值,则必须使用某种类型的iterable(tuple、list、deque)。deque的示例:
from collections import deque
def linear_get_bin_str(n):
bin_strings = deque([''])
for i in xrange(n):
while len(bin_strings[0]) == i:
bin_str = bin_strings.popleft()
for digit in '01':
bin_strings.append(bin_str + digit)
return bin_strings
此函数将为n>0生成字符串,其中您需要的可能是列表而不是前缀
def binary(n,li=["0","1"]):
if n==0:
return []
elif n==1:
return li
lis=[j+i for i in li for j in ["0","1"]]
return binary(n-1,lis)
二进制(2):['00','10','01','11']
二进制(3):
['000','100','010','110','001','101','011','111']
请尝试以下代码:
def print_binary(prefix,n):
if n==0:
print (prefix)
else:
print_binary((prefix+'0'),n-1)
print_binary((prefix+'1'),n-1)
提示:
returnx,y
将返回x
和y
作为tuple
您的逻辑有一个巨大的缺陷:i==1
条件从未达到,因为第一个i==0
始终运行并将始终返回。嗯……如果输入是2
,则输出将是['00',01',11'
。OP似乎也需要'10'
@roi.shtiv-Huh!您在上一次编辑问题时发布了此答案,对吗。