首页 > 解决方案 > Python递归列表理解到迭代方法

问题描述

我试图了解如何迭代地思考递归方法。例如,我有以下回溯方法:

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

谢谢你

标签: pythonrecursioniterationlist-comprehension

解决方案


您的代码中有两个问题。

首先,正如@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在这种情况下调用该方法,因为您已经知道结果。


推荐阅读