2017-08-20 71 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