A方法呼叫B方法,我們很容易理解!
遞迴就是:A方法呼叫A方法!就是自己呼叫自己,因此我們在設計遞迴演算法時,一定要指明什麼時候自己不呼叫自己。否則,就是個死迴圈!
遞迴演算法重點:
遞迴是一種常見的解決問題的方法,即把問題逐漸簡單化。遞迴的基本思想就是“自己呼叫自己”,一個使用遞迴技術的方法將會直接或者間接的呼叫自己。
利用遞迴可以用簡單的程式來解決一些複雜的問題。它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的程式碼量。遞迴的能力在於用有限的語句來定義物件的無限集合。
遞迴結構包括兩個部分:
- 遞迴頭。解釋:什麼時候不呼叫自身方法。如果沒有頭,將陷入死迴圈。
- 遞迴體。解釋:什麼時候需要呼叫自身方法。
【演示:利用程式碼計算5的乘階!】
// 5*4*3*2*1
public static void main(String[] args) {
System.out.println(f(5));
}
public static int f(int n) {
if (1 == n) {
return 1;
} else {
return n*f(n-1);
}
}
此題中,按照遞迴的三個條件來分析:
- 邊界條件:階乘,乘到最後一個數,即1的時候,返回1,程式執行到底;
- 遞迴前進段:當前的引數不等於1的時候,繼續呼叫自身;
- 遞迴返回段:從最大的數開始乘,如果當前引數是5,那麼就是5 4,即5 (5-1),即n * (n-1)
遞迴其實是方便了程式設計師難為了機器,遞迴可以透過數學公式很方便的轉換為程式。其優點就是易理解,容易程式設計。但遞迴是用棧機制實現的,每深入一層,都要佔去一塊棧資料區域,對巢狀層數深的一些演算法,遞迴會力不從心,空間上會以記憶體崩潰而告終,而且遞迴也帶來了大量的函式呼叫,這也有許多額外的時間開銷。所以在深度大時,它的時空性就不好了。(會佔用大量的記憶體空間)
而迭代雖然效率高,執行時間只因迴圈次數增加而增加,沒什麼額外開銷,空間上也沒有什麼增加,但缺點就是不容易理解,編寫複雜問題時困難。