2024-09-29 19:31:48 发布
网友
如何编写一个类似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)
这就是我迄今为止所尝试的
最简单的方法是将计数器向下传递给每个函数,而不是尝试访问函数范围外的变量:
def get_limit(): try: return 1 + get_limit() except RecursionError: return 2
这给了我1000,就像sys.getrecursionlimit()
1000
sys.getrecursionlimit()
为什么?
因此,在函数的每次调用中,函数都会在可以进行多少次递归调用的结果中添加一次。这个问题的答案“还可以进行多少次递归调用?”是由函数本身简单地回答的,因此我们返回1+get_limit(),因为我们被调用了,所以我们必须再返回一次
1
get_limit()
最后,我们必须定义一个基本情况,它将位于树的底部,并处理“可以进行多少[更多]递归调用?”的答案是RecursionError,即“不再”。在本例中,真正的答案是1,但由于实际函数将被调用一次,因此我们应该返回2,以说明树/堆栈顶部的调用,因此在我的示例中,我们的结果是1000,而不是返回999时的结果
RecursionError
2
999
您可以在递归函数中使用try/except,以便能够返回深度计数器:
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
最简单的方法是将计数器向下传递给每个函数,而不是尝试访问函数范围外的变量:
这给了我
1000
,就像sys.getrecursionlimit()
为什么?
因此,在函数的每次调用中,函数都会在可以进行多少次递归调用的结果中添加一次。这个问题的答案“还可以进行多少次递归调用?”是由函数本身简单地回答的,因此我们返回
1
+get_limit()
,因为我们被调用了,所以我们必须再返回一次最后,我们必须定义一个基本情况,它将位于树的底部,并处理“可以进行多少[更多]递归调用?”的答案是
RecursionError
,即“不再”。在本例中,真正的答案是1
,但由于实际函数将被调用一次,因此我们应该返回2
,以说明树/堆栈顶部的调用,因此在我的示例中,我们的结果是1000
,而不是返回999
时的结果您可以在递归函数中使用
try/except
,以便能够返回深度计数器:输出:
在我的机器上,两个结果都是
1000
相关问题 更多 >
编程相关推荐