【问题标题】:Why is there Memory Error in recursion function in python?为什么python中的递归函数会出现内存错误?
【发布时间】:2021-05-31 10:05:50
【问题描述】:

我编写了一个代码来使用 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))

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

【问题讨论】:

  • 您正在遍历ans 并同时在ans 的末尾添加内容。这是一个无限循环(直到ans 变得如此之长以至于您的内存不足)。

标签: python recursion memory memory-management subsequence


【解决方案1】:

这个:

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

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

如果您想向 ans 添加新元素,这些新元素是 curr 前面的每个现有元素,您可以使用列表推导式来做到这一点:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 2013-11-03
    相关资源
    最近更新 更多