Python递归调用开销-在达到setrecursionlimit指定的限制之前,RecursionError结果

50few1ms  于 2023-02-11  发布在  Python
关注(0)|答案(1)|浏览(118)

作为大学作业的一部分,我尝试制作一个基本幂递归函数basicpower。我尝试使用sys.setrecursionlimit(100)将递归限制设置为100。当我使用98到100之间的任何值调用basicpower时,如果显示RecursionError: maximum recursion depth exceeded in comparison错误。然而,如果我用1到97之间的任何值调用basicpower,它都能很好地工作。是什么导致了调用堆栈中的开销?为什么我不能使用sys.setrecursionlimit指定的整数?
基本电源功能代码:

import sys
sys.setrecursionlimit(100)

def basicpower(x, n):
    '''Compute the value x**n for integer n.''' 
    if n == 0:
        return 1 # base case without base case our recursive function will run forever
    else:
        return x  * basicpower(x, n-1) # our recursive call so we are calling the function on itself on a smaller problem space

print(basicpower(2,98))
mf98qq94

mf98qq941#

所以首先要指出的是,因为你最后一次检查是n==0,所以递归调用的总堆栈将是n+1,n为98已经是99个堆栈。
在此之后,我不太确定细节,因为它涉及到一些我从未研究过的python底层功能。然而,sys.setrecursionlimit只是简单地确定python解释器的总堆栈限制,并且递归是在一个print函数中添加另一个堆栈。如果是这样的话,您的总堆栈将是n+2。这使得您在n=98时的堆栈将是100。这就是极限。如果极限不是包含的,它可以解释为什么它在n=98时超出了界限。对于原始脚本作为堆栈的一部分,您可以做的不多,但是您可以改进您的递归,如下所示

def basicpower(x, n):
    '''Compute the value x**n for integer n.''' 
    if n == 1:
        return x # base case without base case our recursive function will run forever
    else:
        return x  * basicpower(x, n-1) # our recursive call so we are calling the function on itself on a smaller problem space

这将使递归调用完成所需的堆栈量减少1。如果要求您能够达到100,而setrecursionlimit也是100,则如果您的课程允许,您可以这样做。

if n==2:
    return x*x

当然,如果您实际上尝试这样做,那么简单地执行x**n会更好。

相关问题