修改python中分配的递归深度

修改python中分配的递归深度,python,Python,如何修改最大递归深度?我认为,在Python中,最大可能的递归是987,因为这一点 def harmonic_sum(n): if(n==1): return 1 else: h_sum=(1/n)+harmonic_sum(n-1) return h_sum >>> harmonic_sum(986) 7.471379033179059 >>> harmonic_sum(987) RuntimeErro

如何修改最大递归深度?我认为,在Python中,最大可能的递归是987,因为这一点

def harmonic_sum(n):
    if(n==1):
        return 1
    else:
        h_sum=(1/n)+harmonic_sum(n-1)
    return h_sum
>>> harmonic_sum(986)
7.471379033179059
>>> harmonic_sum(987)
RuntimeError: maximum recursion depth exceeded in comparison
我编写了一个递归函数来计算2到n的幂,当它达到987时也会失败

是否有一些方法可以修改分配的最大递归深度

请不要建议用迭代的方法来解决这个问题。这是我努力使递归在我的头脑中建立良好的基础。我在网上冲浪,用手中的定时器解决尽可能多的递归问题

import sys
sys.setrecursionlimit(9000)

数字
9000
是任意的。选择与您的应用程序相关的内容。

正如freakish建议的那样,您可以这样做:

def harmonic_sum(n):
    return sum([1/float(x) for x in range(1, n + 1)])

只是一个建议:为什么不把它改为迭代呢?不,不……我将在接下来的3个月里使用递归和避免python中的循环来完成所有工作。我已经厌倦了不能及时使用递归。列表理解很好,但我的目标是学习递归,使其成为我的第二个目标nature@Jack_of_All_Trades那么答案是:你不能。CPython不进行尾部调用优化,也不允许任意增加堆栈空间。如果您想像那样练习递归,请选择另一种语言,或者(更有用)仅在递归转换为循环并不容易的情况下使用递归。像这样的情况已经足够多了,而且大多数都不会溢出堆栈(例如,树和图遍历、解析器、回溯算法等等)。@delnan:尽管如此,在使用python时,我应该始终小心不要超过递归深度。谢谢。我觉得你在努力学习递归很好。但是如果你打算暂时完全放弃循环来学习它,那么你真的,真的应该使用其他的语言。有几个很好的选择,其中包括Scheme和Clojure(两者都是Lisp的风格;还有很多其他的)。-1如果你把它放得太高,并相应地递归,它只会使整个过程崩溃。它不改变可用堆栈空间的大小,只是在Python抛出异常时改变,以避免耗尽所述堆栈空间。请看这个建议出错的例子。@delnan:我很难对这个答案提出错误,因为它确实回答了被问的问题。所以我认为不值得投反对票。设置递归限制是否是一个好主意是另一回事。我碰巧同意这不是一个好主意,所以如果我回答的话,我会尽力阻止OP这么做。。。然后我会告诉他怎么做。@JohnY如果这个答案指向其他选项,并提到将递归限制设置得太高的危险/缺点,我不会投反对票。但这个答案,就目前而言,只是误导:它意味着
sys.setrecursionlimit
解决了OP的问题,而且是最好的/很好的解决方案,尽管它没有(以一种微妙的方式肯定会咬你的屁股)。也许我的反应更为严厉,因为我已经处理过不加考虑地增加递归限制的后果。不,不……我将在接下来的3个月里使用递归并避免python中的循环。我已经厌倦了不能及时使用递归。列表理解很好,但我的目标是学习递归,使其成为我的第二天性。@Jack_of_All_Trades这是一个很好的目标。根据我的经验,我首先使用递归,因为它使它更具可读性。只有当我在递归中解决了它之后,我才会尝试使它变得可移植(因为递归在很多情况下都是内存占用者)。