作为大学作业的一部分,我尝试制作一个基本幂递归函数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))
1条答案
按热度按时间mf98qq941#
所以首先要指出的是,因为你最后一次检查是n==0,所以递归调用的总堆栈将是n+1,n为98已经是99个堆栈。
在此之后,我不太确定细节,因为它涉及到一些我从未研究过的python底层功能。然而,
sys.setrecursionlimit
只是简单地确定python解释器的总堆栈限制,并且递归是在一个print函数中添加另一个堆栈。如果是这样的话,您的总堆栈将是n+2。这使得您在n=98时的堆栈将是100。这就是极限。如果极限不是包含的,它可以解释为什么它在n=98时超出了界限。对于原始脚本作为堆栈的一部分,您可以做的不多,但是您可以改进您的递归,如下所示这将使递归调用完成所需的堆栈量减少1。如果要求您能够达到100,而setrecursionlimit也是100,则如果您的课程允许,您可以这样做。
当然,如果您实际上尝试这样做,那么简单地执行
x**n
会更好。