编写类似sys.getrecursionlimi的递归函数

2024-09-29 19:31:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这就是我迄今为止所尝试的


Tags: defsys情况printtryexceptrecursenonlocal
2条回答

最简单的方法是将计数器向下传递给每个函数,而不是尝试访问函数范围外的变量:

def get_limit():
    try:
        return 1 + get_limit()
    except RecursionError:
        return 2

这给了我1000,就像sys.getrecursionlimit()


为什么?

因此,在函数的每次调用中,函数都会在可以进行多少次递归调用的结果中添加一次。这个问题的答案“还可以进行多少次递归调用?”是由函数本身简单地回答的,因此我们返回1+get_limit(),因为我们被调用了,所以我们必须再返回一次

最后,我们必须定义一个基本情况,它将位于树的底部,并处理“可以进行多少[更多]递归调用?”的答案是RecursionError,即“不再”。在本例中,真正的答案是1,但由于实际函数将被调用一次,因此我们应该返回2,以说明树/堆栈顶部的调用,因此在我的示例中,我们的结果是1000,而不是返回999时的结果

您可以在递归函数中使用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

相关问题 更多 >

    热门问题