更新時間:2020-04-24 14:15:18 來源:動力節點 瀏覽4280次
遞歸是工作中經常會使用到的一種算法,比如階乘的計算就是利用遞歸來實現的,如果您還沒有接觸編程方面的內容,要理解遞歸其實并不困難,它就是在一個函數的內部調用了本身,執行的情況特別類似是一個循環,如果要這么說遞歸似乎沒有什么好說的,但是在這里我希望和大家討論的是遞歸這種算法在使用的時候對系統性能的影響,同時也會和大家分析下在遞歸函數執行過程中內存的變化情況。
特別提醒,在下述內容中方法和函數是同一個意思。
遞歸的實現
為了讓大家更好的理解接下來介紹的內容,同時也為了照顧那些并沒有了解過遞歸的讀者,這里我們先來為搭建演示下在Java中到底如何通過遞歸來實現階乘計算的:
對于上述這段代碼來說,開發人員并不陌生,這也是階乘最簡單的例子,大家可以看到在階乘運算函數factorial()中,如果傳入的參數大于1的話,就會進行一次乘法運算,通過斷點調試理解這個過程并不困難,但是在這里想和大家討論的是在這個階乘運算過程中,系統的內存是如何變化的呢?在上一篇文章中和大家提到過,在系統運行過程中函數參數以及其中的變量都會存放在棧中,那么像這種重復調用自己的函數它的棧是如何變化的呢?通過研究這種變化,就可以知道這種算法在工作中對系統的性能有多大的影響,這是一個值得所有開發人員思考的問題。
遞歸的分析
要研究清楚剛才的問題,我們必須先清楚在程序運行過程中,如果一個函數調用了另外一個函數,那么接下來會發生怎樣的情況?這里設置了這樣一段代碼,就是當數值小于10的時候,加上1輸出,如果大于10的話,需要先減去10,再加上1輸出(當然,這段代碼沒有任何作用,純粹是為了制造一個這樣的場景),在Java中可以用如下的方法實現:
我們可以看到,在這段代碼中,add中調用了另外一個方法sub,但是這時候add方法并沒有結束,所以在程序中應該存在兩個棧,分別是存儲sub、add兩個方法中內容的,也就是如下情況:
為什么sub對應的棧會在add上邊呢?這是因為棧是后進先出的,因為sub方法在add方法之后執行,所以sub對應的棧應該在add上邊,當sub方法執行完畢之后,系統自動銷毀這塊空間,重新又回到了add方法中,最后當程序結束的時候add方法對應的空間也會被銷毀,其中的變量、參數也會隨著被消失,為了方便大家理解這個過程,這里準備了一張過程圖:
到這里為止,我們知道了在一個函數中運行另外一個函數,會在內存中為這個函數開辟一塊空間,當這個函數執行完畢之后,這塊空間會被計算機銷毀,重新回到之前的函數中,也就是說在此之前,運行的這個函數占據的空間一直存在,明白這個道理之后,我們再次回到剛開始的遞歸算法中。假設我們現在要計算3的階乘,那么在整個過程中,內存的變化就可以這樣表示:
很顯然,隨著我們傳入的參數越來越大,整個過程會越來越復雜,而每次調用遞歸函數調用自身之后,都會在計算機中開辟一塊新的空間,這說明使用此種方法對系統的性能會有一定的影響,特別是當我們遞歸執行的次數很多的時候,特別容易造成系統崩潰。
以上就是動力節點java培訓機構的小編針對“Java基礎學習:java中的遞歸算法”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習