1 定義
乙個函式自己直接或間接呼叫自己
2 舉例
#include
#include
voidf(
int n)
else
}int
main
(void
)
執行結果
3 n的階乘用遞迴來實現
3.1 如果不用遞迴來實現
3.2 如果用遞迴來實現
4 1+2+3+…+100之和用遞迴來實現
4.1 不用遞迴實現
4.2 用遞迴實現
5 乙個函式為什麼可以自己呼叫自己
函式的呼叫:
當在乙個函式的執行期間呼叫另乙個函式時,在執行被調函式之前,系統需要完成三件事:
將所有的實際引數,返回位址等資訊傳遞給被調函式儲存
為被調函式的區域性變數(包括形參)分配儲存空間
將控制轉移到被調函式的入口
從被調函式返回主調函式之前,系統也要完成三件事:
儲存被調函式的返回結果
釋放被調函式所佔的儲存空間
依照被調函式儲存的返回位址將控制轉移到呼叫函式
當有多個函式相互呼叫時,按照「後呼叫先返回」的原則,上述函式之間資訊傳遞和控制轉移必須借助「棧」來實現,即系統將整個程式執行時所需的資料空間安排在乙個棧中,每當呼叫乙個函式時,就在棧頂分配乙個儲存區,進行壓棧操作,每當乙個函式退出時,就釋放它的儲存區,進行出棧操作,當前執行的函式永遠在棧頂位置。
a函式呼叫a函式和a函式呼叫b函式在計算機看來是沒有任何區別的,只不過用我們日常的思維方式理解比較怪異而已!
例子: 間接呼叫自己舉例
#include
voidg(
int)
;voidf(
int n)
voidg(
int m)
intmain
(void
)
6 遞迴必須滿足三個條件
遞迴必須得有乙個明確的終止條件
該函式所處理的資料規模必須在遞減
這個轉化必須是可解的
例子: 遞增的值可以增加,但處理的資料的規模需要遞減
#include
intf
(int n)
intmain
(void
)
解析: 如下圖
7 迴圈和遞迴的比較
理論上,所有的迴圈都可以轉化成遞迴,但是用遞迴能解決的問題不一定能用迴圈解決。
遞迴:易於理解,速度慢,儲存空間大
迴圈:不易理解,速度快,儲存空間小
郝斌老師資料結構10(遞迴)
這對你的編碼能力是個質的飛躍,如果你想成為乙個很厲害的程式設計師,資料結構是必須要掌握的,因為計算機專業的本科生也達不到這水平!計算機特別適合用遞迴的思想來解決問題,但是我們人類用遞迴的思想來考慮問題就會感到十分困擾,這也是很多學過遞迴的人一直都搞不明白的地方!那是不是遞迴可以隨便寫,當然不是,有些...
郝斌老師 資料結構入門 之快速排序
include void quicksort int int,int int findpos int int,int 主要思想 通過移動和賦值的方式確定第乙個元素的最終位置,然後在用同樣的方法分別確定第乙個元素的最終位置的左邊一部分和右邊一部分的第乙個元素的最終位置,以此類推 intmain voi...
郝斌資料結構自學筆記 5 預備知識 指標
5 預備知識 指標 2 指標的重要性 指標是c語言的靈魂 定義 cpu 位址線,控制線,資料線 記憶體 指標 指標就是位址,位址就是指標。指標變數是存放記憶體單元位址的變數。指標的本質是乙個操作受限的非負整數。分類 1.基本型別的指標 2.指標和陣列的關係 變數並不一定連續分配,隨機分配記憶體。記憶...