Python 获得';壳牌返回-1073741571';使用递归查找最多n个项的总和时

Python 获得';壳牌返回-1073741571';使用递归查找最多n个项的总和时,python,recursion,Python,Recursion,我尝试递归地查找sum,但当我为n输入大值时,得到了“shell returned-1073741571”。它适用于小数值n,比如100。我觉得这个错误与堆栈有关,但不确定其原因。我增加了递归限制,这样就不会达到递归限制。这是我的代码: import sys sys.setrecursionlimit(1000000) print(sys.getrecursionlimit()) def get_sum(num): if num == 1: return 1 el

我尝试递归地查找sum,但当我为n输入大值时,得到了“shell returned-1073741571”。它适用于小数值n,比如100。我觉得这个错误与堆栈有关,但不确定其原因。我增加了递归限制,这样就不会达到递归限制。这是我的代码:

import sys
sys.setrecursionlimit(1000000)
print(sys.getrecursionlimit())
def get_sum(num):
    if num == 1:
        return 1
    else:
        return num + get_sum(num-1)

print(get_sum(10000))
编辑: 规格:windows10,python3.7,编辑器:Vim

我还尝试了Python 3.6版的PyCharm。仍然是相同的问题。

setrecursionlimit仅在python解释器内设置限制,在linux/unixish操作系统上,检查ulimit输出的堆栈大小限制。

当我在编辑器上运行代码时,我收到以下错误:

文件“J:/maskros/Pithon/test.py”,第8行,在get_sum中

return num+get_sum(num-1)

[上一行重复了997次]

内存错误:堆栈溢出

这是因为它达到了递归极限,但当我将递归极限设置为一个较低的值时,它就起作用了,如果你将setrecursion减少到10000,那么它可能会起作用

在评论中,有人指出尝试较低的值是行不通的。 提到的值对我不起作用,但这个值起作用

import sys
sys.setrecursionlimit(4999)
print(sys.getrecursionlimit())


def get_sum(num):
    if num == 1:
        return 1
    else:
        return num + get_sum(num-1)

print(get_sum(4998))

所以我会猜测并检查,直到得到一个好的值。

您能列出您的系统规格吗?我在使用4G RAM和Python 3.7.3的Ubuntu18.04上得到了正确的答案。不,我尝试过为递归设置较低的值,但没有成功。你尝试了什么值?编辑的问题。实际上,我是在Windows 10上。同样的原则是,操作系统为堆栈设置了一个内存大小值,python的setrecursionlimit基本上是一种安全机制,可以防止您破坏整个python解释器。如果您违反它,它将抛出一个可捕获的异常。炸毁整个堆栈不会导致可捕获的异常,它会结束操作系统进程。