1. 程式人生 > >Python之路_遞歸

Python之路_遞歸

出了 自然 無限 次數 函數調用 超過 one 棧幀 rec

概念: 函數直接或者間接調用自身就是 遞歸 遞歸需要有邊界條件。遞歸前進段。遞歸返回段 遞歸一定要有邊界條件(否則會出現無限遞歸前進) 當邊界條件不滿足的時候,遞歸前進 當邊界條件滿足的時候,遞歸返回 遞歸要求: 遞歸一定要有退出條件,遞歸調用一定要執行到這個退出條件。沒有退出條件的遞歸調用,就是無限調用 遞歸調用的深度不宜過深 Python對遞歸調用的深度做了限制,以保護解析器 超過遞歸深度限制,拋出RecursionError:maxinum recursion depth exceeded超出最大深度、 sys.getrecursionlimit()查看最大深度 邊界值:不是終止遞歸的返回值,而是作為遞歸運算最後一次運算的時調用的值。 當觸發邊界時,也就意味調用邊界值進入遞歸運算中,計算出結果彈出, 從而中斷遞歸。 1.循環稍微復雜一些,但是只要不是死循環,可以多次叠代直至算出結果 2.fib函數代碼極簡易懂,但是只能獲取到最外層的函數調用,內部遞歸結果都是中間結果.而且給定一個n都要進行近2n次遞歸,深度越深,效率越低。為了獲取斐波那契數列需要外面在套一個n次的循環,效率就更低了 3.遞歸還有深度限制,如果遞歸復雜,函數反復壓棧,棧內存很快就溢出了 1.間接遞歸,是通過別的函數調用了函數自身 2.但是,如果構成了循環遞歸調用時非常危險的,但是往往這種情況在代碼的情況下,還是可能發生這種調用。要用代碼規範來避免這種遞歸調用的發生 總結: 遞歸是一種很自然的表達,符合邏輯思維 遞歸相對運行效率低,每一次調用函數都要開辟棧幀 遞歸有深度限制,如果遞歸層次太深,函數反復壓棧,棧內存很快就溢出了 如果是有限次數的遞歸,可以使用遞歸調用,或者使用循環代替,循環代碼稍微復雜一些,但是只要不是死循環,可以多次叠代直至算出結果 絕大多數遞歸,都可以使用循環實現 即使遞歸代碼很簡潔,但是能不用則不用遞歸

Python之路_遞歸