编写类似于sys.getrecursionlimit的递归函数

时间:2018-09-28 21:49:08

标签: python recursion

如何编写类似于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)

这是我到目前为止尝试过的。

2 个答案:

答案 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