更新時(shí)間:2020-04-13 16:38:53 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2419次
棧
提到方法的遞歸調(diào)用,需要先說(shuō)一下棧的存儲(chǔ)概念。
棧是一個(gè)先進(jìn)后出的壓入(push)和彈出(pop)式數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)。若想獲取到棧底的對(duì)象,就必須先將這個(gè)對(duì)象上面的所有的對(duì)象全部從棧中移除,否則無(wú)法獲取棧底的對(duì)象。
我們來(lái)看看程序中棧是如何工作的,當(dāng)一個(gè)方法(調(diào)用者)調(diào)用另一個(gè)方法(被調(diào)用者)時(shí),將會(huì)將調(diào)用者的參數(shù)和返回值一起壓入到棧中,此時(shí)調(diào)用者方法處于棧頂?shù)奈恢茫?dāng)調(diào)用者執(zhí)行到調(diào)用方法的語(yǔ)句時(shí),此時(shí)調(diào)用者方法將不會(huì)繼續(xù)執(zhí)行,即將執(zhí)行被調(diào)用者方法,那么被調(diào)用者就會(huì)與參數(shù)返回值一起壓入到棧中,此時(shí)被調(diào)用者處于棧頂?shù)奈恢茫源藭r(shí)先執(zhí)行被調(diào)用者方法。直到被調(diào)用者方法執(zhí)行結(jié)束,所有的參數(shù)以及局部變量會(huì)隨著方法的執(zhí)行結(jié)束一起彈出棧空間,此時(shí)被調(diào)用者方法的返回值將會(huì)被帶出方法,數(shù)據(jù)不會(huì)隨著方法的出棧而消失,而是會(huì)落入到此時(shí)棧頂?shù)姆椒ㄖ校苑椒ǖ姆祷刂凳欠祷氐椒椒ǖ恼{(diào)用處
下圖是以上代碼執(zhí)行過(guò)程中,棧空間中存儲(chǔ)的變化:
方法的遞歸調(diào)用
遞歸調(diào)用是一種特殊的嵌套調(diào)用,是某個(gè)方法直接或間接的調(diào)用自己,實(shí)際上相當(dāng)于是循環(huán)執(zhí)行功能代碼。換句話(huà)說(shuō),就是可以使用方法遞歸調(diào)用完成的功能,同樣也可以使用循環(huán)完成。
方法遞歸調(diào)用的分類(lèi)
直接遞歸:現(xiàn)有fun方法,在fun方法中調(diào)用fun方法,這種調(diào)用方式稱(chēng)為直接遞歸調(diào)用。
間接遞歸:現(xiàn)有fun1方法和fun2方法,在fun1方法中調(diào)用fun2方法,在fun2方法中調(diào)用fun1方法,實(shí)際并沒(méi)有在fun1方法中直接調(diào)用自己,而是調(diào)用了fun2方法,間接的調(diào)用了fun1方法,這種調(diào)用方式稱(chēng)為間接遞歸調(diào)用。
遞歸調(diào)用的案例
案例:設(shè)計(jì)一個(gè)方法,使用循環(huán)計(jì)算一個(gè)整數(shù)的階乘結(jié)果。
當(dāng)然,這個(gè)案例也可以使用方法的遞歸調(diào)用來(lái)完成,關(guān)于這個(gè)問(wèn)題使用遞歸調(diào)用完成時(shí),與數(shù)學(xué)中的一類(lèi)題目類(lèi)似:
上圖的數(shù)學(xué)問(wèn)題,若想計(jì)算解集的話(huà),需要將x的值帶入到表達(dá)式中,但是對(duì)于x的不同取值范圍,需要使用不同的表達(dá)式計(jì)算結(jié)果。對(duì)于這個(gè)數(shù)學(xué)問(wèn)題的計(jì)算過(guò)程,再次我們就不在演示。
若使用遞歸調(diào)用的方法計(jì)算一個(gè)整數(shù)的階乘結(jié)果時(shí),我們已知n的階乘計(jì)算方法是從1開(kāi)始乘一直乘到n為止,所以1的階乘結(jié)果是1。那么計(jì)算n的階乘,當(dāng)n>1時(shí),n的階乘等于n乘n-1的階乘;當(dāng)n=1時(shí),n的階乘等于1。通過(guò)分析,請(qǐng)我們可以使用分支結(jié)果完成分析過(guò)程中的:當(dāng)...則...,當(dāng)...則...
我們可以將遞歸調(diào)用寫(xiě)成一下格式的分段函數(shù):
遞歸調(diào)用中的返回值
由于方法的返回值返回到方法的調(diào)用處,所以方法遞歸調(diào)用返回時(shí)是一層一層的向外返回。
我們都玩過(guò)歡樂(lè)球,歡樂(lè)球中灌了水,再將歡樂(lè)球放進(jìn)一個(gè)盛水的小玻璃缸中,小玻璃缸放進(jìn)一個(gè)大玻璃缸中,將歡樂(lè)球中捅破時(shí),歡樂(lè)球中的水一定是進(jìn)入到小玻璃缸中,而不是直接進(jìn)入大玻璃缸中。
下圖是遞歸調(diào)用計(jì)算階乘的返回值的圖,返回值一定是一層一層向外返回,而不是最內(nèi)層的返回整個(gè)方法結(jié)束。
方法壓棧與方法遞歸
以上敘述我們說(shuō)過(guò),一個(gè)方法在執(zhí)行時(shí),會(huì)壓入棧中,而遞歸調(diào)用相當(dāng)于多次調(diào)用同一個(gè)方法,那么遞歸幾次,就會(huì)在棧中開(kāi)辟幾個(gè)相同大小的空間,所以使用遞歸調(diào)用時(shí),比較好性能,我們可以通過(guò)循環(huán)來(lái)完成遞歸完成的功能。
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java基礎(chǔ)學(xué)習(xí):java方法的遞歸講解”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€(xiàn)咨詢(xún),有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743