1. 程式人生 > >對遞迴的簡單認識

對遞迴的簡單認識

1.遞迴簡單認識

遞迴解決問題就是把大問題變成小問題。函式之間的迴圈呼叫。

2.遞迴的裡面問題

方法自己呼叫自己,最重要可能是遞迴的結束調節,因為每一個方法的執行都會產生一個棧,然而棧是有大小的,如果無限遞迴就會產生stackOverofMemeory(棧溢位),並且每一個方法都有自己的私有變數。而且每一次的方法呼叫都會產生一個棧幀,也會隨著方法的結束而銷燬。

棧幀的基本概念:本地變量表,運算元棧,動態連結,方法返回地址

本地變量表:是一個數組型別,主要儲存基本變數(byte,boolean等),引用地址,方法返回值,那麼數組裡面的一個變數佔用4個位元組,然而long,double型別呢,當然佔用8個位元組。

運算元棧:是一個後進先出棧結構,主要是進行算數運算和方法裡面的引數傳值。

動態連結:棧幀指向常量池的引用。

方法返回地址:方法的返回值有兩種情況,一種是異常情況,方法沒有返回值,不會處理異常,另一種是正常情況,返回給呼叫者正常值。

3.遞迴裡面的執行過程

執行結果:

分析:我們可以看出求階乘是遞迴裡面比較簡單的例子,但是下面的快速排序法裡面使用遞迴演算法,如果我們在不看執行結果,寫出裡面的執行結果,說明我們對遞迴有了自己的認識。

這裡面我們至於要把握住兩點,一個是遞迴的結束條件。每一個方法都有自己的私有變數。

遞迴的缺點:

1.遞迴的呼叫就是函式自己呼叫,當它自己呼叫自己時,會在棧中重新分配空間,還有需要入棧和出棧有需要花費時間

2.遞迴如果大於棧的分配的記憶體空間,會產生棧溢位的危險。

3.方便了程式設計師,難為了機器。可能二叉樹的前中後序用遞迴很容易實現,但是不用遞迴許多人估計很虛。