對(duì)于遞歸有沒(méi)有什么好的理解方法?
這幾天正好在回顧以前寫(xiě)的算法demo,發(fā)現(xiàn)遞歸在很多算法之中得到廣泛的應(yīng)用,比如自己寫(xiě)的快速排序,二分查找等算法demo中均有應(yīng)用;
我總結(jié)了遞歸的幾個(gè)要素,只要掌握了就可以輕松寫(xiě)出遞歸代碼(比如方法為search1);
1,遞歸的動(dòng)力:比如說(shuō)二分查找(找到某個(gè)有序數(shù)組中指定的某個(gè)數(shù)N,二分查找采取不斷比較中間值的方式,并收縮上下限,直到查到指定的值或者退出),不斷地比較中間的值,這就是遞歸下去的動(dòng)力,寫(xiě)偽代碼 return search1,這一句就代表遞歸;
2,遞歸的對(duì)象:上面說(shuō)的有序數(shù)組就是遞歸的對(duì)象,寫(xiě)偽代碼如下:return search1(array);
3,遞歸的分支:上面說(shuō)了,二分查找的遞歸需要朝數(shù)組的兩個(gè)方法遞歸,所以需要選擇,并且更改條件,寫(xiě)偽代碼如下:if(up) search1(array,index1,index2,N)if(down) search1(array,index3,index4,N)
4,遞歸的結(jié)束:遞歸的結(jié)束無(wú)外乎是找到了值,或者不滿足遞歸動(dòng)力了(比如說(shuō)數(shù)組下限大于上限了),偽代碼如下:if(下限大于上限 || Narray[array.length-1] )if(array[index] == N) return index;
5,讓遞歸結(jié)束:的算法整個(gè)過(guò)程中,能讓遞歸結(jié)束的只有下標(biāo)的不斷變化,因?yàn)槊看味际钦疑舷孪薜闹虚g值,所以算法為int mid = (begin + end)/2;
最后的代碼如下:
public static int search1(int[] arr, int begin, int end, int N) { int mid = (begin + end) / 2; //算法保證變化 if (N < arr[begin] || N > arr[end] || arr[begin] > arr[end]) { //控制結(jié)束,指標(biāo)下限超過(guò)上限 return -1; } if (arr[mid] < N) {//小于,則向下遞歸 return search1(arr, mid + 1, end, N); } else if (arr[mid] > N) {//大于,則向上遞歸 return search1(arr, begin, mid - 1, N); } else return mid; //相等的時(shí)候,控制結(jié)束 }
遞歸講解就到這了,需要二分法算法和快速排序Demo的也可以私我,更多的技術(shù)分享,敬請(qǐng)關(guān)注。。