以此類推是遞迴的基本思想。
具體來講就是把規模大的問題轉化為規模小的相似的子問題來解決。在函式實現時,因為解決大問題的方法和解決小問題的方法往往是同乙個方法,所以就產生了函式呼叫它自身的情況。另外這個解決問題的函式必須有明顯的結束條件,這樣就不會產生無限遞迴的情況了。
遞迴的兩個條件
遞迴演算法的一般形式: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
public
static
long
factorial(
int
n)
throws
exception
在求解6的階乘時,遞迴過程如下所示。
我們會驚奇的發現這個過程和棧的工作原理一致對,遞迴呼叫就是通過棧這種資料結構完成的。整個過程實際上就是乙個棧的入棧和出棧問題。然而我們並不需要關心這個棧的實現,這個過程是由系統來完成的。
那麼遞迴中的「遞」就是入棧,遞進;「歸」就是出棧,回歸。
我們可以通過乙個更簡單的程式來模擬遞進和回歸的過程:
1
2
3
4
5
6
7
8
9
10
11
12
/**
* 關於 遞迴中 遞進和回歸的理解
* @param n
*/
public
static
void
recursion_display(
int
n)
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
public
static
int
fib(
int
n)
throws
exception
遞迴呼叫的過程像樹一樣,通過觀察會發現有很多重複的呼叫。
歸併排序
歸併排序也是遞迴的典型應用,其思想:將序列分為若干有序序列(開始為單個記錄),兩個相鄰有序的序列合併成乙個有序的序列,以此類推,直到整個序列有序。
1
2
3
4
5
6
7
8
9
10
11
//遞迴過程是:在遞進的過程中拆分陣列,在回歸的過程合併陣列
public
static
void
mergesort(
int
source,
int
temp,
int
first,
int
last)
else
if
(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 ...