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,因为你已经知道结果了。