2017-08-20 39 views
0

我很新的python和有关递归错误的几个问题:“RuntimeError:超过最大递归深度”。 我知道这个错误是在Python中以避免堆栈溢出。 我现在已经做的示例代码是什么在这里:如何清除python递归?

import sys 

def print1(): 
    print("1") 
    return print2() 

def print2(): 
    print("2") 
    return print3() 
------------- 
def print3() - def print7() <- (wrote here like this to save some place) 
------------- 
def print8(): 
    print("8") 
    return print9() 

def print9(): 
    print("9") 

def main(): 
    sys.setrecursionlimit(11) 
    print sys.getrecursionlimit() 
    print1() 

if __name__ == "__main__": 
    main() 

现在,如果已经设置递归限制到11,那么代码将运行,不会有什么错误。 输出:

11 
1 
2 
3 
4 
5 
6 
7 
8 
9 

如果我设置了递归限制为10,那么就会出现一个错误:

10 
1 
2 
3 
4 
5 
6 
7 
8 
Traceback (most recent call last): 
    File "nimetu1.py", line 44, in <module> 
    main() 
    File "nimetu1.py", line 41, in main 
    print1() 
    File "nimetu1.py", line 5, in print1 
    return print2() 
    File "nimetu1.py", line 9, in print2 
    return print3() 
    File "nimetu1.py", line 13, in print3 
    return print4() 
    File "nimetu1.py", line 17, in print4 
    return print5() 
    File "nimetu1.py", line 21, in print5 
    return print6() 
    File "nimetu1.py", line 25, in print6 
    return print7() 
    File "nimetu1.py", line 29, in print7 
    return print8() 
    File "nimetu1.py", line 33, in print8 
    return print9() 
RuntimeError: maximum recursion depth exceeded 

我的问题是,有没有什么解决办法清除递归或一些其他的解决方案,如何编写类似于此的代码,其中一个函数调用另一个函数,并且不需要最后一个调用当前函数的函数。 例如,我可以清除递归print2()并运行代码递归限制为10. 我想写一个代码,其中总是函数调用另一个函数,所以为了节省RAM我想我需要一些替代或其他解决方案。 代码也可能会多次调用相同的函数..所以稍后可能会有3个不同的相同功能块运行,这就是我想要避免的。

+0

由于您没有解释什么是用例,因此从您的代码显示的内容来看,您肯定会错误地解决您的问题。 –

+0

我的目标是为我自己制作基于终端的信息保存器。 例如,有一个名为Mainmenu的函数,可以选择调用子菜单,例如,写入1以进入子菜单1或写入2以进入子菜单2,所有菜单菜单和子菜单都将是函数..并且这就像函数总是调用其他函数一样。 。在每个子菜单上,我想添加“后退”按钮,就像插入0一样,你可以返回上一级菜单或子菜单,这样返回按钮必须调用上次菜单功能... – Venomed

+0

你应该将菜单描述为对象,不是作为功能。 –

回答

1

做一个循环调用任何咚你返回:

def main(): 
    toDo = print1 
    while toDo: 
    toDo = toDo() 

print1回报旁边叫不叫它什么:

def print1(): 
    print("1") 
    return print2 

你需要为它停下来的唯一的事情就是返回False而不是下一个要调用的函数。

堆栈将为每次调用重绕,永不累积。

+0

谢谢你的答案,这真的工作:) – Venomed