簡單的說,遞歸就是函數自己調用自己。在數據結構裏面會經常使用遞歸,因爲遞歸代碼比較簡潔優雅,易懂。
編寫遞歸程序時主要注意三點
(1)遞歸總有一個最簡單的情況,方法的第一條語句總是包含return的條件語句
(2)遞歸調用總是去嘗試解決一個規模更小的子問題,這樣遞歸才能收斂到最簡單的情況。在下面代碼中,第四個參數和第三個參數的差值一直在縮小
(3)遞歸調用的父問題和嘗試解決的子問題之間不應該有交集。在如下代碼中,兩個子問題,各自操作的數組部分是不同的
下面是二分法查找的遞歸實現和非遞歸實現;
特別注意一點,二分查找技術,是針對有序的數組和順序表,不能忘記前提
//使用遞歸實現二分法查找,同時使用函數重載 public static int rank(int key,int a[]) { return rank( key,a,0,a.length-1); } public static int rank(int key,int[]a,int lo,int hi) { if(lo>hi) return -1; int mid=lo+(hi-lo)/2; if(key<a[mid]) return rank(key,a,lo,mid-1); else if(key>a[mid]) return rank(key,a,mid+1,hi); else return mid; }
二分查找算法的非遞歸實現
public static int BinarySearch(int arr[],int key) { int low,high,mid; low=0; high=arr.length-1; while(low<=high) { mid=low+(high-low)/2; if(key<arr[mid]) high=mid-1; else if(key>arr[mid]) low=mid+1; else return mid; } return 0; }