Python 对迭代方法的递归列表理解
Python recursive list comprehension to iterative approach
我正在尝试了解如何迭代地思考递归方法。比如我有如下的回溯方法:
def bitStr(n, s):
if n == 1:
return s
return [digit + bits for digit in bitStr(1, s) for bits in bitStr(n - 1, s)]
我正在练习如何使用双 for 循环迭代或明确地完成类似的任务。
我开始了这样的事情,我知道这是不正确的;但是,无法修复它:
def bitStr2(n, s):
if n == 1:
return [c for c in s]
for bits in bitStr2(n - 1, s):
for digit in bitStr2(1, s):
return digit + bits
谢谢
您的代码中有两个问题。
首先,正如@MisterMiyagi 所指出的,您切换了循环。在列表理解中,循环是从左到右读取的。您应该像这样编写常规循环:
for digit in bitStr2(1, s):
for bits in bitStr2(n - 1, s):
...
其次,列表推导产生……一个列表。您必须将元素存储在列表中:
...
result = []
for digit in bitStr2(1, s):
for bits in bitStr2(n - 1, s):
result.append(digit + bits)
return result
(相反:如果您不想生成列表,则永远不要使用列表理解。)并且您不必以不同方式处理 n = 1
案件。完整代码:
def bitStr2(n, s):
if n == 1:
return s
result = []
for digit in bitStr2(1, s):
for bits in bitStr2(n - 1, s):
result.append(digit + bits)
return result
请注意 for digit in bitStr(1, s)
等同于 for digit in s
。我不明白你为什么在这种情况下调用方法 bitStr
,因为你已经知道结果了。
我正在尝试了解如何迭代地思考递归方法。比如我有如下的回溯方法:
def bitStr(n, s):
if n == 1:
return s
return [digit + bits for digit in bitStr(1, s) for bits in bitStr(n - 1, s)]
我正在练习如何使用双 for 循环迭代或明确地完成类似的任务。
我开始了这样的事情,我知道这是不正确的;但是,无法修复它:
def bitStr2(n, s):
if n == 1:
return [c for c in s]
for bits in bitStr2(n - 1, s):
for digit in bitStr2(1, s):
return digit + bits
谢谢
您的代码中有两个问题。
首先,正如@MisterMiyagi 所指出的,您切换了循环。在列表理解中,循环是从左到右读取的。您应该像这样编写常规循环:
for digit in bitStr2(1, s):
for bits in bitStr2(n - 1, s):
...
其次,列表推导产生……一个列表。您必须将元素存储在列表中:
...
result = []
for digit in bitStr2(1, s):
for bits in bitStr2(n - 1, s):
result.append(digit + bits)
return result
(相反:如果您不想生成列表,则永远不要使用列表理解。)并且您不必以不同方式处理 n = 1
案件。完整代码:
def bitStr2(n, s):
if n == 1:
return s
result = []
for digit in bitStr2(1, s):
for bits in bitStr2(n - 1, s):
result.append(digit + bits)
return result
请注意 for digit in bitStr(1, s)
等同于 for digit in s
。我不明白你为什么在这种情况下调用方法 bitStr
,因为你已经知道结果了。