【Java数据结构系列】递归

递归是函数调用自身的一种特殊的编程技术,其应用主要在以下几个方面: 
阶乘
在 java 当中的基本形式是:Public    void    mothed(int n){//当满足某条件时: 
  Mothed(n‐1) ; 

递归二分查找 
Java 二分查找实现,欢迎大家提出交流意见.

 1 /** 

 2 *名称:BinarySearch 

 3 *功能:实现了折半查找(二分查找)的递归和非递归算法. 

 4 *说明: 

 5 * 1、要求所查找的数组已有序,并且其中元素已实现 Comparable<T>接口,如

 6 Integer、String 等. 

 7 * 2、非递归查找使用 search();,递归查找使用 searchRecursively(); 

 8 * 

 9 *本程序仅供编程学习参考 

10 * 

11 *@author: Winty 

12 *@date: 2008-8-11 

13 *@email: [email][email protected][/email] 

14 */ 

15 

16 class BinarySearch<T extends Comparable<T>> { 

17 private T[] data;//要排序的数据 

18 

19 public BinarySearch(T[] data){ 

20 this.data = data; 

21 } 

22 

23 public int search(T key){ 

24 int low; 

25 int high; 

26 int mid; 

27 

28 if(data == null) 

29 return -1; 

30 

31 low = 0; 

32 high = data.length - 1; 

33 

34 while(low <= high){ 

35 mid = (low + high) / 2; 

36 System.out.println("mid " + mid + " mid value:" + data[mid]);/// 

37 

38 if(key.compareTo(data[mid]) < 0){ 

39 high = mid - 1; 

40 }else if(key.compareTo(data[mid]) > 0){ 

41 low = mid + 1; 

42 }else if(key.compareTo(data[mid]) == 0){ 

43 return mid; 

44 } 

45 } 

46 

47 return -1; 

48 } 

49 

50 private int doSearchRecursively(int low , int high , T key){ 

51 int mid; 

52 int result; 

53 

54 if(low <= high){ 

55 mid = (low + high) / 2; 

56 result = key.compareTo(data[mid]); 

57 System.out.println("mid " + mid + " mid value:" + data[mid]);/// 

58 

59 if(result < 0){ 

60 return doSearchRecursively(low , mid - 1 , key); 

61 }else if(result > 0){ 

62 return doSearchRecursively(mid + 1 , high , key); 

63 }else if(result == 0){ 

64 return mid; 

65 } 

66 } 

67 

68 return -1; 

69 } 

70 

71 public int searchRecursively(T key){ 

72 if(data ==null)return -1; 

73 

74 return doSearchRecursively(0 , data.length - 1 , key); 

75 } 

76 

77 public static void main(String[] args){ 

78 Integer[] data = {1 ,4 ,5 ,8 ,15 ,33 ,48 ,77 ,96}; 

79 BinarySearch<Integer> binSearch = new BinarySearch<Integer>(data); 

80 //System.out.println("Key index:" + binSearch.search(33) ); 

81 

82 System.out.println("Key index:" + binSearch.searchRecursively(3) ); 

83 

84 //String [] dataStr = {"A" ,"C" ,"F" ,"J" ,"L" ,"N" ,"T"}; 

85 //BinarySearch<String> binSearch = new BinarySearch<String>(dataSt

86 r); 

87 //System.out.println("Key index:" + binSearch.search("A") ); 

88 } 

89 } 

递归排序 
其实在数组的全排序中完全可以使用更加易懂简便的写法——for 循环, 但是通过
for 循环编写数组全排序需要有一个先决条件——知道数组全排序的个数, 因为有
n 个数据全排序就需要写 n 个嵌套 for 循环。因此在写全排序时一般使用递归方
法。这就是我的第一个关于递归排序的见解——递归排序可以无需已知排序数组
的长度,即排序个数!

其二,不管是使用递归进行数组排序还是使用 for 循环进行数组的排序,它们都
是本质都是使用枚举, 因此可以得出这样一个结论:枚举可以确保找出每一种可能
的排序规则!
其三,枚举是列出所有的方法并找出符合要求的算法,因此其算法效率一定比较
的低,需要对其进行优化,才能达到较好的效果(递归的时候排除所有不可能的
方案)
消除递归 
消除递归的基本思路是用栈来模拟系统的函数调用从而消除递归。
基本上要做一下三件事:传递参数(包括返回地址)并转到函数入口;获得参数
并处理参数;根据传入的返回地址返回

你可能感兴趣的:(java)