回覆列表
  • 1 # 此生唯一

    這幾天正好在回顧以前寫的演算法demo,發現遞迴在很多演算法之中得到廣泛的應用,比如自己寫的快速排序,二分查詢等演算法demo中均有應用;

    我總結了遞迴的幾個要素,只要掌握了就可以輕鬆寫出遞迴程式碼(比如方法為search1);

    1,遞迴的動力:比如說二分查詢(找到某個有序陣列中指定的某個數N,二分查詢採取不斷比較中間值的方式,並收縮上下限,直到查到指定的值或者退出),不斷地比較中間的值,這就是遞迴下去的動力,寫虛擬碼 return search1,這一句就代表遞迴;

    2,遞迴的物件:上面說的有序陣列就是遞迴的物件,寫虛擬碼如下:return search1(array);

    3,遞迴的分支:上面說了,二分查詢的遞迴需要朝陣列的兩個方法遞迴,所以需要選擇,並且更改條件,寫虛擬碼如下:if(up) search1(array,index1,index2,N)if(down) search1(array,index3,index4,N)

    4,遞迴的結束:遞迴的結束無外乎是找到了值,或者不滿足遞迴動力了(比如說陣列下限大於上限了),虛擬碼如下:if(下限大於上限 || Narray[array.length-1] )if(array[index] == N) return index;

    5,讓遞迴結束:的演算法整個過程中,能讓遞迴結束的只有下標的不斷變化,因為每次都是找上下限的中間值,所以演算法為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]) { //控制結束,指標下限超過上限 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; //相等的時候,控制結束 }

    遞迴講解就到這了,需要二分法演算法和快速排序Demo的也可以私我,更多的技術分享,敬請關注。。

  • 2 # 匨囻團囝

    哈哈,這種情況跟當年初學程式設計的我一樣啊。

    首先,你既然能問出來這個問題,我假定你已經看了一些遞迴的程式例子了,而不是隻看了定義就來談這個(要是你真沒看,就先去看吧)

    然後,在遞迴裡,有一個很重要的東西,就是遞迴的退出條件,這個東西是所有遞迴算法理解的基礎,遞迴一定有退出條件,不然就必定導致程式永遠執行不完。退出條件就是這個遞迴的程式跑到什麼情況的時候,就不繼續呼叫自己了。這個退出條件可能是遞迴的次數,也可能是判斷某個數是不是夠大,或者不再有子結點,等等。通常如果你看到的遞迴函數里有兩個或兩個以上的return(比如像 if A return X else return 函式自己),那麼不是return函式自己的那行就是退出條件了。

    找到退出條件以後,剩下的就簡單了,你把退出條件以外的部分拆成一摸一樣的函式來理解就可以了。舉例子,有個遞迴函式F(int x),返回段有一句是return F(k),那麼你這樣改寫:

    F1(int x),F2(int x),F3(int x)

    函式體都一樣,抄F(int x)的就行,只是把那個return那裡改一下,原來的return F(k)在F1中改成return F2(k),F2中改成return F3(k),總之就是不斷引下一個函式來執行就行。

    然後你就發現,反正函式體都一樣,我幹嘛要這麼sb把這函式寫N遍,直接return自己不就好了!

    你能讀懂到這裡,你就已經能理解了,還不理解就找個例程按我上面說的自己拆開寫一下。

    遞迴,其實就是:從前有座山,山頂有座廟,廟裡有個老和尚,正在講故事,講什麼故事?他講:“從前有座山…

    然後這個故事整體達到5000字的時候就不繼續了,這個5000字就是退出條件了。

    理解心得是:1 不要順著分析,先找退出條件,這極大有利於你理解這個演算法為什麼這樣寫而遞迴只是其中的過程而已 2 讀不明白程式時把那個遞迴函式拆成三個一樣的, 用迭代來連起來,假定在第三個的時候,退出條件達到了,不再遞迴/迭代,這樣的情況下再理解。

  • 3 # nnnemooooo

    我個人理解,遞迴就是將一個大任務,分解成小任務,幾個小任務的解合併後就是大任務的解。當然小任務會繼續細分下去,直到不可再分。

    例如求階乘n!

    我們用f(n)表示n!

    f(n)=n*f(n-1),n>1 任務細分

    f(n)=1,n==1 不可再分

    上面就是一個任務細分,直到不可再分的條件

    int f(n) {

    if (n==1)

    return 1;

    else

    return n * f(n-1);

    }

  • 中秋節和大豐收的關聯?
  • 大雁為什麼排成“人”字形或“一”字形飛行?