深入理解遞迴

2021-08-18 16:22:59 字數 2869 閱讀 5158

以此類推是遞迴的基本思想。

具體來講就是把規模大的問題轉化為規模小的相似的子問題來解決。在函式實現時,因為解決大問題的方法和解決小問題的方法往往是同乙個方法,所以就產生了函式呼叫它自身的情況。另外這個解決問題的函式必須有明顯的結束條件,這樣就不會產生無限遞迴的情況了。

遞迴的兩個條件

遞迴演算法的一般形式:1

2

3

4

5

6

7

func( mode)else

}

求乙個數的階乘是練習簡單而典型的例子,階乘的遞推公式為:factorial(n)=n*factorial(n-1),其中n為非負整數,且0!=1,1!=1

我們根據遞推公式可以輕鬆的寫出其遞迴函式:

1

2

3

4

5

6

7

8

publicstaticlongfactorial(intn)throwsexception

在求解6的階乘時,遞迴過程如下所示。

我們會驚奇的發現這個過程和棧的工作原理一致對,遞迴呼叫就是通過棧這種資料結構完成的。整個過程實際上就是乙個棧的入棧和出棧問題。然而我們並不需要關心這個棧的實現,這個過程是由系統來完成的。

那麼遞迴中的「遞」就是入棧,遞進;「歸」就是出棧,回歸。

我們可以通過乙個更簡單的程式來模擬遞進和回歸的過程:

1

2

3

4

5

6

7

8

9

10

11

12

/**

* 關於 遞迴中 遞進和回歸的理解

* @param n

*/

publicstaticvoidrecursion_display(intn)

system.out.println("回歸:"+ temp);

}

斐波那契數列

斐波那契數列的遞推公式:fib(n)=fib(n-1)+fib(n-2),指的是如下所示的數列:

1、1、2、3、5、8、13、21.....

按照其遞推公式寫出的遞迴函式如下:

1

2

3

4

5

6

7

8

publicstaticintfib(intn)throwsexception

遞迴呼叫的過程像樹一樣,通過觀察會發現有很多重複的呼叫。

歸併排序

歸併排序也是遞迴的典型應用,其思想:將序列分為若干有序序列(開始為單個記錄),兩個相鄰有序的序列合併成乙個有序的序列,以此類推,直到整個序列有序。

1

2

3

4

5

6

7

8

9

10

11

//遞迴過程是:在遞進的過程中拆分陣列,在回歸的過程合併陣列

publicstaticvoidmergesort(intsource,inttemp,intfirst,intlast)elseif(first == last)

}

同樣呼叫過程向樹一樣,但是它並沒有重複呼叫的問題。在遞進的過程中拆分陣列,在回歸的過程合併陣列 。通過遞迴來實現歸併排序,程式結構和條理非常清晰。

深入理解遞迴

以此類推是遞迴的基本思想。具體來講就是把規模大的問題轉化為規模小的相似的子問題來解決。在函式實現時,因為解決大問題的方法和解決小問題的方法往往是同乙個方法,所以就產生了函式呼叫它自身的情況。另外這個解決問題的函式必須有明顯的結束條件,這樣就不會產生無限遞迴的情況了。遞迴的兩個條件 1 可以通過遞迴呼...

深入理解遞迴

遞迴例子 includevoid up and down int int main void void up and down int n level 1 1 location 0022ff10 level 2 1 location 0022fef0 level 3 1 location 0022f...

深入理解遞迴演算法

下面是對遞迴演算法執行過程的理解 結合漢諾塔問題 原始碼 public class hanoi else public static void main string args 為了方便我等下解釋執行過程,也把 的截圖貼在下面 準備工作做完了,正式開始理解過程的講解 以漢諾塔三個圓盤時為例,這裡n ...