深入理解遞迴思想
阿新 • • 發佈:2018-11-13
1、什麼是遞迴
本質上,將原來的問題轉換為更小的同一問題。問題規模可以不斷縮小,直到達到一個不能再縮小的基本問題,解決這個基本問題,就解決了整個問題。
例如,使用遞迴思想對自然數1、2、3…n-1 、n求和:
sum(n) = n +sum(n-1); //sum(n-1)就是被轉換後規模更小的同一問題。
sum(n-1)=n-1 +sum(n-2)
…
sum(2)= 2 +sum(1) //直到問題不能再小 n=1 為止
程式碼的實現非常簡單,一起來看看:
/**
* @author evan
*使用遞迴思想對自然數1、2、3...n求和
*/
public class Sum {
public static int sum(int n) {
if (n==1) {
return 1;
}
return n+sum(n-1);
}
public static void main(String[] args) {
System.out.println(sum(100));
}
}
2、編寫遞迴程式的思路
編寫遞迴程式的思路主要有兩步:
1、求解 最基本的問題。
2、將原問題轉換為更小的問題(難點)。
2.1、連結串列具有天然的遞迴結構
連結串列具有天然的遞迴結構,這是因為我們既可以將連結串列看做是一個個的元素節點掛載起來,也可以把整個連結串列看做是Node1元素節點掛載了一條以Node2為頭節點的連結串列的連結串列。說起來 可能有點拗口 ,其實就是:
整條連結串列 = Node1節點 + 子連結串列(以Node2為頭結點的連結串列)。
舉例:利用遞迴刪除連結串列中的元素。
public void remove(E e) {
solveRemove2(dummyHead ,e);
}
/**
* 用遞迴來刪除連結串列中元素 寫法二
* @param head 頭結點
* @param e 要刪除的值
* @return 刪除後的連結串列,代表一條子連結串列
*/
private Node solveRemove2(Node head ,E e) {
if (head == null) {
return null;
}
head.next = solveRemove2 (head.next, e);
return head.data==e ? head.next:head;
}