将递归 Python 生成器函数转换为非生成器函数
Convert Recursive Python Generator Function to Non Generator Function
我在 Python 中有以下函数,我想将它转换成一个更普通的函数,不使用 yield
以便我可以将它翻译成其他语言。
有人可以解释一下我该怎么做吗?
该函数只是打印出 n
选择 m
的排列。
即对于 n==4
、m==2
,它将创建以下形式的数组:
1001
、1100
、1010
等。
def bitmasks(n, m):
if n == m:
yield (1 << n) - 1
elif m > 0:
for x in bitmasks(n-1, m-1):
yield (1 << (n-1)) + x
for x in bitmasks(n-1, m):
yield x
else:
yield 0
该函数不打印任何内容,它只是逐个生成每个结果。您可以在开始时创建一个空列表,然后将每个 yield
替换为 append
到您的列表中。最后,您只是 return 完整的结果列表。
将您的结果添加到列表中。
def bitmasks(n, m):
if n == m:
return [(1 << n) - 1]
elif m > 0:
res = []
for x in bitmasks(n-1, m-1):
res.append((1 << (n-1)) + x)
for x in bitmasks(n-1, m):
res.append(x)
return res
else:
return [0]
我在 Python 中有以下函数,我想将它转换成一个更普通的函数,不使用 yield
以便我可以将它翻译成其他语言。
有人可以解释一下我该怎么做吗?
该函数只是打印出 n
选择 m
的排列。
即对于 n==4
、m==2
,它将创建以下形式的数组:
1001
、1100
、1010
等。
def bitmasks(n, m):
if n == m:
yield (1 << n) - 1
elif m > 0:
for x in bitmasks(n-1, m-1):
yield (1 << (n-1)) + x
for x in bitmasks(n-1, m):
yield x
else:
yield 0
该函数不打印任何内容,它只是逐个生成每个结果。您可以在开始时创建一个空列表,然后将每个 yield
替换为 append
到您的列表中。最后,您只是 return 完整的结果列表。
将您的结果添加到列表中。
def bitmasks(n, m):
if n == m:
return [(1 << n) - 1]
elif m > 0:
res = []
for x in bitmasks(n-1, m-1):
res.append((1 << (n-1)) + x)
for x in bitmasks(n-1, m):
res.append(x)
return res
else:
return [0]