数据结构之递归
程序调用自身的编程技巧称为递归( 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