我想知道是否有一种标准的方法或更好的方法来控制无限递归,而不是我下面的代码?我希望我的递归函数在最大尝试后放弃。下面的代码通过引入try方法参数并在递归调用期间递增它来实现它。还有更好的方法吗?
def Rec(attempt=0):
if attempt==10:
return()
else:
print(attempt)
Rec(attempt=attempt+1)
Rec()
答案 0 :(得分:3)
还有这种方式但不推荐用于您想要做的事情 - 我只是将其发布以供参考,并且在其他情况下很好用...
#!/usr/bin/env python
import sys
sys.setrecursionlimit(5)
def Rec(attempt=0):
print attempt
Rec(attempt=attempt+1)
try:
Rec()
except RuntimeError:
print 'maximum recursion depth exceeded'
来自sys.setrecursionlimit(limit)
更清楚一点,正如python docs中sys.setrecursionlimit(limit)
所做的那样:
将Python解释器堆栈的最大深度设置为limit。这个 limit可防止无限递归导致C溢出 堆栈并崩溃Python。
可能的最高限制取决于平台。用户可能需要 当她有一个需要深度的程序时,将限制设置得更高 递归和支持更高限制的平台。这应该是 小心,因为太高的限制可能会导致崩溃。
所以在我看来,除非你非常清楚自己在做什么,否则不要乱用 Python解释器堆栈。
答案 1 :(得分:3)
您可以创建一个装饰器,然后您可以使用其通常的退出条件编写正确的递归函数,但也会施加递归限制:
def limit_recursion(limit):
def inner(func):
func.count = 0
def wrapper(*args, **kwargs):
func.count += 1
if func.count < limit:
result = func(*args, **kwargs)
else:
result = None
func.count -= 1
return result
return wrapper
return inner
您的代码将是(限制为3):
@limit_recursion(limit=3)
def Rec():
print('hi')
Rec()
运行:
>>> Rec()
hi
hi
hi
答案 2 :(得分:0)
你的已经很好了。这是要走的路。它很好,因为它重量轻。你基本上需要一个int
和一个条件分支 - 那就是它。
或者你可以尝试保证在没有计数器的条件下打破循环(但这通常取决于具体情况)。