调用另一个函数后如何强制函数退出?

时间:2017-08-04 19:47:13

标签: python function tail-recursion

我有两个函数,每个函数在最后一行调用另一个函数作为传递控制的方法。是否有一种优雅的方法可以强制一个函数在另一个函数执行之前退出,这样你就不会将程序堆积在尸体上? 例如:

def f1(x):
    print("f1",x)
    f2(x+1)

def f2(x):
    print("f2",x)
    f1(x+1)

f1(0)

现在的方式,在大约1000次调用后它会进入递归限制。
原因是,一个简单的外部控制结构可以解决问题,但我宁愿拥有控制流程刻在功能上。

编辑:

但这不是一个阻碍吗?

如果Python努力成为具有高级抽象的高级语言,那么在模块上构建模块的某些时候,Python不会因为自己的行为而崩溃,而不会减少其占用空间吗?

4 个答案:

答案 0 :(得分:4)

如果你希望在调用另一个函数之前退出一个函数,你必须实际退出函数而不是让它调用另一个函数:

def f1(x):
    print('f1', x)
    return f2, (x+1,)
def f2(x):
    print('f2', x)
    return f1, (x+1,)

f, args = f1, (0,)
while True:
    f, args = f(*args)

这将需要您想要避免的外部控制结构。

顺便说一句,你试图让函数调用工作的方式与GOTO非常相似,并且最终会对程序的复杂性和可维护性产生同样的影响。

答案 1 :(得分:0)

最简单的方法是在函数中设置一个条件以终止/停止递归。

可能是这样的:

def f1(x):
if x == 30:           #Set a limit in order to just print, without calling
    print("f1", x)
else:
    print("f1",x)
    f2(x+1)

def f2(x):
    print("f2",x)
    f1(x+1)

f1(0)

答案 2 :(得分:0)

简单解决方案

你可以添加一个if语句:

def f1(x):
    print("f1", x)
    if x <= 30:
        f2(x+1)

def f2(x):
    print("f2",x)
    if x <= 30:
        f1(x+1)

答案很长

如果您可以在调用下一个函数之前强制退出该函数,那么答案是 -ish。具体来说,您要求进行python does not optimize的尾递归优化。

答案 3 :(得分:0)

正如user2357112指出的那样,我不确定你为什么要这样做。

但是,如果您真的必须这样做,那么您可以为函数指定一个布尔值,以表明它已被调用。

def f1(x):
    print("f1",x)
    f1.called = True
    if not f2.called:
        f2(x+1)

def f2(x):
    print("f2",x)
    f2.called = True
    if not f1.called:
        f1(x+1)

f1(0)