什麼是遞迴函式?

2021-08-15 16:54:37 字數 2162 閱讀 5171

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

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

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

注:

遞迴的時候,每次呼叫乙個函式,計算機都會為這個函式分配新的空間,這就是說,當被調函式返回的時候,呼叫函式中的變數依然會保持原先的值,否則也不可能實現反向輸出。

計算n的階乘

#include 

int factorial(int n)

else

if (n==0 || n==1)

else

return result;

}int main()

程式在計算5的階乘的時候,先執行遞推,當n=1或者n=0的時候返回1,再回推將計算並返回。由此可以看出遞迴函式必須有結束條件

斐波那契數列

斐波那契數列指的是這樣乙個數列:

0, 1, 1, 2, 3, 5, 8, 13, 21, ···
這個數列從第三項開始,每一項都等於前兩項之和.

應用題~~

小明為了學好英語,需要每天記單詞,第一天記1個,第二天記2個依次類推,請用**完成,算出小明第10天開始的時候會了多少個單詞?

分析:

牆(結束條件)是「第一天記1個」

遞推關係是「第n天記的單詞= 第n-1天記的單詞數量+n」

#include 

/* 定義獲取單詞數量的函式 */

int getwordnumber(n)

else

}int main()

遞迴函式特點:

1. 每一級函式呼叫時都有自己的變數,但是函式**並不會得到複製,如計算5的階乘時每遞推一次變數都不同;

2. 每次呼叫都會有一次返回,如計算5的階乘時每遞推一次都返回進行下一次;

3. 遞迴函式中,位於遞迴呼叫前的語句和各級被呼叫函式具有相同的執行順序;

4. 遞迴函式中,位於遞迴呼叫後的語句的執行順序和各個被呼叫函式的順序相反;

5. 遞迴函式中必須有終止語句。

一句話總結遞迴:自我呼叫且有完成狀態。系統棧(也叫核心棧、核心棧)

是記憶體中屬於作業系統空間的一塊區域,其主要用途為: (1)儲存中斷現場,對於巢狀中斷,被中斷程式的現場資訊依次壓入系統棧,中斷返回時逆序彈出; (2)儲存作業系統子程式間相互呼叫的引數、返回值、返回點以及子程式(函式)的區域性變數。

使用者棧

是使用者程序空間中的一塊區域,用於儲存使用者程序的子程式間相互呼叫的引數、返回值、返回點以及子程式(函式)的區域性變數。

我們編寫的遞迴程式屬於使用者程式,因此使用的是使用者棧。

棧溢位

函式呼叫的引數是通過棧空間來傳遞的,在呼叫過程中會占用執行緒的棧資源。而遞迴呼叫,只有走到最後的結束點後函式才能依次退出,而未到達最後的結束點之前,占用的棧空間一直沒有釋放,如果遞迴呼叫次數過多,就可能導致占用的棧資源超過執行緒的最大值,從而導致棧溢位,導致程式的異常退出。

綜上:

函式呼叫的時候,每次呼叫時要做位址儲存,引數傳遞等,這是通過乙個遞迴工作棧實現的。具體是每次呼叫函式本身要儲存的內容包括:區域性變數、形參、呼叫函式位址、返回值。那麼,如果遞迴呼叫n次,就要分配n次區域性變數、n次形參、n次呼叫函式位址、n次返回值,勢必效率低.

**簡潔、清晰,易懂

==迴圈能幹的事,遞迴都能幹;遞迴能幹的迴圈不一定能幹==

對於我們,能用迴圈解決的,盡量不適用遞迴.

什麼是遞迴 先了解什麼是遞迴

一說起遞迴,我想每個人都不陌生。舉個從小就聽過的例子 從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山 還有你從兩面相對的鏡子中看到的畫面,其實都是抽象出來的遞迴現象,但是嚴格來說並不是遞迴,因為會一直重複下去,沒有終止條件,那就稱為...

什麼是遞迴 先了解什麼是遞迴

原文 一說起遞迴,我想每個人都不陌生。舉個從小就聽過的例子 從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山.還有你從兩面相對的鏡子中看到的畫面,其實都是抽象出來的遞迴現象,但是嚴格來說並不是遞迴,因為會一直重複下去,沒有終止條件,那...

什麼是遞迴 先了解什麼是遞迴

歡迎閱讀我的個人部落格,有更好的排版和文章 一說起遞迴,我想每個人都不陌生。舉個從小就聽過的例子 從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山.還有你從兩面相對的鏡子中看到的畫面,其實都是抽象出來的遞迴現象,但是嚴格來說並不是遞迴...