我有一个函数的形式:
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
实例。
我要感谢你给@o2genum和Kyle Miller的灵感,他写了一篇关于这个问题的优秀文章。
不管消除这个限制有多好,也许,你必须这样做
标题>