控制无限递归的更好方法

时间:2017-03-24 22:39:48

标签: python algorithm recursion

我想知道是否有一种标准的方法或更好的方法来控制无限递归,而不是我下面的代码?我希望我的递归函数在最大尝试后放弃。下面的代码通过引入try方法参数并在递归调用期间递增它来实现它。还有更好的方法吗?

def Rec(attempt=0):
    if attempt==10:
        return()
    else:
        print(attempt)
        Rec(attempt=attempt+1)

Rec()

3 个答案:

答案 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和一个条件分支 - 那就是它。

或者你可以尝试保证在没有计数器的条件下打破循环(但这通常取决于具体情况)。