程序調用自身的編程技巧稱為遞歸( recursion)。遞歸做為一種算法在程序設計語言中廣泛應用。 一個過程或函函數在其定義或說明中有直接或間接調用自身的一種方法,它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。遞歸的能力在於用有限的語語句來定義對象的無線集合。一般來說,遞歸需要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。介紹遞歸幾個典型例子。
一、數字三角形
具體代碼實現:
1 // 遞歸經典案列:數字三角形 2 public static int trigle(int n) { 3 if (n == 1) { 4 return 1; 5 } 6 return n + trigle(n - 1); 7 }
二、遞歸實現變位字(全排列)
1 // 遞歸實現變位字(全排列) 2 public static void permutation(char[] buf, int start, int end) { 3 if (start == end) {// 當只要求對數組中一個字母進行全排列時,只要就按該數組輸出即可 4 for (int i = 0; i <= end; i++) { 5 System.out.print(buf[i]); 6 } 7 System.out.println(); 8 } else {// 多個字母全排列 9 for (int i = start; i <= end; i++) { 10 char temp = buf[start];// 交換數組第一個元素與后續的元素 11 buf[start] = buf[i]; 12 buf[i] = temp; 13 14 permutation(buf, start + 1, end);// 后續元素遞歸全排列 15 16 temp = buf[start];// 將交換后的數組還原 17 buf[start] = buf[i]; 18 buf[i] = temp; 19 } 20 } 21 }
三、遞歸解決階乘問題
1 // 遞歸解決階乘問題 2 public static int factorial(int n) { 3 if (n == 0) { 4 return 1; 5 } 6 return n * factorial(n - 1); 7 }
四、遞歸實現二分查找(其實用的是分治的思想)
1 // 分治:遞歸實現二分查找 2 public static int recBinary(int arr[], int search, int left, int right) { 3 int half; 4 while (left <= right) { 5 half = (left + right) / 2; 6 if (arr[half] > search) { 7 return recBinary(arr, search, left, half - 1); 8 } else if (arr[half] < search) { 9 return recBinary(arr, search, half + 1, right); 10 } else { 11 return half; 12 } 13 } 14 return -left - 1; 15 }
五、遞歸實現漢諾塔
具體代碼實現:
1 // 遞歸實現漢諾塔,把圓盤從A借助B移動到C 2 public static void hanio(int n, char from, char inter, char to) { 3 if (n == 1) { 4 System.out.println("disk 1 from " + from + " to " + to); 5 } else { 6 hanio(n - 1, from, to, inter); 7 System.out.println("disk " + n + " from " + from + " to " + to); 8 hanio(n - 1, inter, from, to); 9 } 10 }
程序運行結果: disk 1 from A to C disk 2 from A to B disk 1 from C to B disk 3 from A to C disk 1 from B to A disk 2 from B to C disk 1 from A to C