1. 程式人生 > >深入理解遞迴思想

深入理解遞迴思想

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; }