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