回覆列表
  • 1 # 使用者7169188564904

    遞迴就是一個函式在它的函式體內呼叫它自身。執行遞迴函式將反覆呼叫其自身,每呼叫一次就進入新的一層。遞迴函式必須有結束條件。

    當函式在一直遞推,直到遇到牆後返回,這個牆就是結束條件。

    所以遞迴要有兩個要素,結束條件與遞推關係。

    遞迴有兩個基本要素:

    (1)邊界條件:確定遞迴到何時終止,也稱為遞迴出口。

    (2)遞迴模式:大問題是如何分解為小問題的,也稱為遞迴體。遞迴函式只有具備了這兩個要素,才能在有限次計算後得出結果

    在遞迴函式中,呼叫函式和被呼叫函式是同一個函式,需要注意的是遞迴函式的呼叫層次,如果把呼叫遞迴函式的主函式稱為第0層,進入函式後,首次遞迴呼叫自身稱為第1層呼叫;從第i層遞迴呼叫自身稱為第i+1層。反之,退出第i+1層呼叫應該返回第i層。

    一個遞迴函式的呼叫過程類似於多個函式的巢狀的呼叫,只不過呼叫函式和被呼叫函式是同一個函式。為了保證遞迴函式的正確執行,系統需設立一個工作棧。具體地說,遞迴呼叫的內部執行過程如下:

    (1)運動開始時,首先為遞迴呼叫建立一個工作棧,其結構包括值參、區域性變數和返回地址;

    (2)每次執行遞迴呼叫之前,把遞迴函式的值參和區域性變數的當前值以及呼叫後的返回地址壓棧;

    (3)每次遞迴呼叫結束後,將棧頂元

    擴充套件資料:

    遞迴就是某個函式直接或間接地呼叫了自身,這種呼叫方式叫做遞迴呼叫。說白了,還是函式呼叫。既然是函式呼叫,那麼就有一個雷打不動的原則:所有被呼叫的函式都將建立一個副本,各自為呼叫者服務,而不受其他函式的影響。

    你的ff函式,遞迴多少次,就有多少個副本,再利用記憶體的棧式管理,反向退出。這個最好找一下“棧”這方面的東西看看,挺容易的,就像子彈匣一樣,先進後出。

    從某種意義上說,這是不對的,因為就像剛才說的,一旦被呼叫,他將在記憶體中複製出一份程式碼,再被呼叫就再複製一份,換句話說,你可以吧同一個函式的多次呼叫理解稱謂多個不同函式的一次呼叫,這樣也會會簡單些。

    再說=1和=0是為什麼退出。遞迴,很需要注意的就是死遞迴,也就是說,某一個函式進入了無限呼叫自身的情況,永無止境地消耗記憶體等資源,這在程式設計方面是一大忌。

    但凡是遞迴的函式,一定會在某一個地方存在能夠返回上一層函式的程式碼,否則必定死遞迴。ff函式中,那個else就是返回的出口,你可以這樣想,如果沒有那個if來進行判斷,你遞迴到什麼時候算完?ff是不是會一直呼叫自己。

    因為一旦某個函式A中呼叫了函式B(或者自己),那麼A中的程式碼會停在呼叫的位置,而轉向B中去執行,同理,如果B又呼叫函式C,那麼B又停在呼叫的位置,去執行C,如果無限呼叫,那麼程式是永遠不會結束的。

    參考資料:

  • 中秋節和大豐收的關聯?
  • 養胃的蔬菜有哪些?