为什么python的递归函数中存在内存错误?

问题描述

我写了一段代码,在 python 中使用递归来获取字符串的所有子序列。下面是代码

def solve(s):

    if (len(s)==0):
        return [""]
    curr = s[0]
    res = s[1:]
    ans = solve(res)
    for i in ans:
        ans.append(curr+i)
    return ans
if __name__=="__main__":
    s=str(input())
    print(solve(s))

对于input="ab",上面的代码抛出内存错误

我不知道为什么会这样。

代码更改为以下代码后,它起作用了。

def solve(s):

    if (len(s)==0):
        return [""]
    curr = s[0]
    res = s[1:]
    ans = solve(res)
    new = []
    for i in ans:
        new.append(i)
        new.append(curr+i)

    return new

if __name__=="__main__":
    s=str(input())
    print(solve(s))

谁能解释一下第一个代码内存错误背后的原因是什么? 提前致谢。

解决方法

这个:

for i in ans:
    ans.append(curr+i)

您正在遍历 ans 并同时将内容添加到 ans 的末尾。这是一个无限循环:您永远不会到达 ans 的末尾,因为您会不断延长它(直到内存耗尽)。

如果您想向 ans 添加新元素,这些新元素是每个以 curr 开头的现有元素,您可以使用列表推导来实现:

ans += [curr + i for i in ans]

这种方式计算所有的新元素,然后然后将它们全部添加到 ans 上,而不是继续扩展 ans