如何在包含控制流的Python函数中消除递归



我有一个函数的形式:

def my_func(my_list):
    for i, thing in enumerate(my_list):
        my_val = another_func(thing)
        if i == 0:
            # do some stuff
        else:
            if my_val == something:
                return my_func(my_list[:-1])
            # do some other stuff

递归部分被调用足够,我得到一个RecursionError,所以我试图用一个while循环代替它,正如这里所解释的,但我无法解决如何调和这与控制流语句在函数。任何帮助都将不胜感激!

可能有一个很好的确切答案,但是从递归切换到迭代的最通用(或者可能是快速而肮脏的)方法是自己管理堆栈。只要手动执行编程语言隐式执行的操作,就可以拥有自己的无限堆栈。

在这个特殊的例子中有尾递归。您可以看到,my_func递归调用结果不被调用者以任何方式使用,而是立即返回。最后发生的事情是,最深层递归调用的结果冒泡出来,并按原样返回。这就是使@outoftime的解决方案成为可能的原因。我们只对递归传递感兴趣,因为递归的返回传递是微不足道的。因此,将递归传递替换为迭代。

def my_func(my_list):
    run = True
    while run:
        for i, thing in enumerate(my_list):
            my_val = another_func(thing)
            if i == 0:
                # do some stuff
            else:
                if my_val == something:
                    my_list = my_list[:-1]
                    break
                # do some other stuff    

这是一个迭代的方法。

<标题>装饰h1> 使用此装饰器,只需用@TailCaller装饰器包装函数并返回用所需参数初始化的TailCall实例。

我要感谢你给@o2genumKyle Miller的灵感,他写了一篇关于这个问题的优秀文章。

不管消除这个限制有多好,也许,你必须这样做

最新更新