如何编写类似于sys.getrecursionlimit的递归函数,从而在不导入任何库的情况下获得递归限制?
def recurse(n):
m = 0
def recurse2(n):
nonlocal m
m = m+1
n-recurse2(n-1)
try:
recurse2(n)
except RecursionError:
print(m)
这是我到目前为止尝试过的。
答案 0 :(得分:2)
最简单的方法是将计数器传递给每个函数,而不是尝试从函数范围之外访问变量:
def get_limit():
try:
return 1 + get_limit()
except RecursionError:
return 2
这为我提供了1000
-就像sys.getrecursionlimit()
。
为什么?
因此,在每次调用该函数时,该函数都会向可以进行更多递归调用的结果中添加一个。这个问题的答案是“可以进行多少个(更多)递归调用?”可以简单地由函数本身来回答,所以我们返回1
+ get_limit()
,因为我们被调用了,所以我们必须再返回一个。
最后,我们必须定义一个基本案例,该案例将位于树的底部并处理“可以进行多少[更多]个递归调用”的答案?是RecursionError
,即“不再”。在这种情况下,真正的答案是1
,但是由于实际函数将被调用一次,因此我们应该返回2
来说明树/堆栈顶部的调用,从而使结果为,对于我来说,是1000
而不是我们返回999
时的1
。
答案 1 :(得分:1)
您可以在递归函数中使用try/except
来返回深度计数器:
def _get_recursion_limit(n = 1):
try:
return _get_recursion_limit(n+1)
except RecursionError:
return n+1 #account for last attempt with increment
import sys
print(_get_recursion_limit())
print(sys.getrecursionlimit())
输出:
1000
1000
在我的计算机上,两个结果均为1000
。