遞迴就是乙個函式在它的函式體內呼叫它自身。執行遞迴函式將反覆呼叫其自身,每呼叫一次就進入新的一層。遞迴函式必須有結束條件。
當函式在一直遞推,直到遇到牆後返回,這個牆就是結束條件。
所以遞迴要有兩個要素,結束條件與遞推關係
注:
遞迴的時候,每次呼叫乙個函式,計算機都會為這個函式分配新的空間,這就是說,當被調函式返回的時候,呼叫函式中的變數依然會保持原先的值,否則也不可能實現反向輸出。
計算n的階乘
程式在計算5的階乘的時候,先執行遞推,當n=1或者n=0的時候返回1,再回推將計算並返回。由此可以看出遞迴函式必須有結束條件。#include
int factorial(int n)
else
if (n==0 || n==1)
else
return result;
}int main()
斐波那契數列
斐波那契數列指的是這樣乙個數列:
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次返回值,勢必效率低.
**簡潔、清晰,易懂
==迴圈能幹的事,遞迴都能幹;遞迴能幹的迴圈不一定能幹==
對於我們,能用迴圈解決的,盡量不適用遞迴.
什麼是遞迴 先了解什麼是遞迴
一說起遞迴,我想每個人都不陌生。舉個從小就聽過的例子 從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山 還有你從兩面相對的鏡子中看到的畫面,其實都是抽象出來的遞迴現象,但是嚴格來說並不是遞迴,因為會一直重複下去,沒有終止條件,那就稱為...
什麼是遞迴 先了解什麼是遞迴
原文 一說起遞迴,我想每個人都不陌生。舉個從小就聽過的例子 從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山.還有你從兩面相對的鏡子中看到的畫面,其實都是抽象出來的遞迴現象,但是嚴格來說並不是遞迴,因為會一直重複下去,沒有終止條件,那...
什麼是遞迴 先了解什麼是遞迴
歡迎閱讀我的個人部落格,有更好的排版和文章 一說起遞迴,我想每個人都不陌生。舉個從小就聽過的例子 從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山.還有你從兩面相對的鏡子中看到的畫面,其實都是抽象出來的遞迴現象,但是嚴格來說並不是遞迴...