昨天看了歸并排序和快速排序泡徙,排序的思路都理解了,代碼是使用遞歸實(shí)現(xiàn)的漏峰,但是在單步調(diào)試的時(shí)候糠悼,斷點(diǎn)跳來(lái)跳去,整個(gè)人都暈了浅乔,所以我執(zhí)著的精神又開始發(fā)揮作用了倔喂,在網(wǎng)上找了個(gè)類似的例子,一步步調(diào)試過(guò)來(lái)靖苇,終于斷點(diǎn)如我所愿的跳了出來(lái)席噩。決定把思路整理一下,這也是菜鳥成長(zhǎng)史的一小步吧贤壁,言歸正傳悼枢。
一、什么是遞歸函數(shù)脾拆?
遞歸函數(shù)即自調(diào)用函數(shù)馒索,在函數(shù)體內(nèi)直接或間接調(diào)用自己(也就是調(diào)用的函數(shù)是自己本身)莹妒。
二、函數(shù)的調(diào)用機(jī)制
1绰上、需要設(shè)置自調(diào)用的條件旨怠,如果滿足條件,則調(diào)用函數(shù)本身渔期,如果不滿足條件运吓,則終止本函數(shù)的自調(diào)用,然后把目前流程的主控權(quán)交回給上一層函數(shù)來(lái)執(zhí)行疯趟;
2拘哨、每調(diào)用一次函數(shù)就“入棧”一次信峻,函數(shù)執(zhí)行完了倦青,就“出棧”一次盹舞;
三产镐、遞歸的評(píng)價(jià)
1、缺點(diǎn):遞歸增加了系統(tǒng)的開銷踢步,從時(shí)間上癣亚,執(zhí)行調(diào)用與返回的額外工作需要占用一定的時(shí)間,從空間上來(lái)講获印,每遞歸一次述雾,就要入棧一次,即棧內(nèi)存就多占用一截兼丰。
2玻孟、優(yōu)點(diǎn):簡(jiǎn)化程序設(shè)計(jì)、程序容易讀懂鳍征。
下面這幾個(gè)是個(gè)人覺得關(guān)于遞歸函數(shù)和遞歸函數(shù)的執(zhí)行機(jī)制黍翎,寫的很容易理解的博文:
?遞歸函數(shù)的執(zhí)行機(jī)制和運(yùn)用
四、華麗麗的成長(zhǎng)史
這個(gè)是我參考的博文艳丛,遞歸算法示例匣掸,寫的很詳細(xì)、通俗易懂氮双。
首先貼出代碼:
下面是程序的運(yùn)行結(jié)果:
下面是整個(gè)程序的執(zhí)行過(guò)程旺聚;
對(duì)結(jié)果進(jìn)行分析:
a、步驟10~14重復(fù)了步驟4~8眶蕉,因?yàn)樗鼈兌颊{(diào)用了p(1)砰粹,所以結(jié)果5重復(fù)了結(jié)果4,輸出都是1;
b碱璃、步驟17~29重復(fù)了步驟3~15弄痹,因?yàn)樗鼈兌颊{(diào)用了p(2),所以第6嵌器、7肛真、8個(gè)結(jié)果重復(fù)了第3、4爽航、5個(gè)結(jié)果蚓让,輸出都是2、1讥珍、1历极;
c、步驟31~58重復(fù)了步驟2~29衷佃,因?yàn)樗鼈兌颊{(diào)用了p(3)趟卸,所以第9~15個(gè)結(jié)果重復(fù)了第2~8個(gè)結(jié)果,輸出都是3氏义、2锄列、1、1惯悠、2邻邮、1、1克婶。
總之筒严,要理解函數(shù)遞歸調(diào)用的機(jī)制必須明白每對(duì)函數(shù)進(jìn)行一次調(diào)用,函數(shù)就入棧一次鸠补,函數(shù)執(zhí)行完了萝风,就出棧一次嘀掸,如果還不是很明白紫岩,可以結(jié)合程序運(yùn)行過(guò)程的說(shuō)明,對(duì)代碼進(jìn)行單步調(diào)試睬塌,這樣會(huì)比較容易理解泉蝌。
邁過(guò)了遞歸的坎兒,終于可以整理歸并排序和快速排序的知識(shí)點(diǎn)了揩晴,很開森的我于是就屁顛屁顛的跟著師父去興慶公園賞花啦勋陪!