日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法4(一、递归学习)

發布時間:2023/12/31 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法4(一、递归学习) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

每次用遞歸都感覺有點難,這個趁著惡補基礎知識的時候,專門看了一遍遞歸,算法4的。

1.1 遞歸介紹

方法可以調用自己,例如:下面給出了bin_search的二分查找的一種實現。(算法4中使用的是Java,但是我是c++系的,就用c++實現,語言不重要)。我們就會經常使用遞歸,因為遞歸代碼比相應的非遞歸代碼更加簡潔優雅、易懂。下面這種實現中的注釋就言簡意賅地說明了代碼的作用。

int bin_search(int key, int *a, int left, int right) {//遞歸第一條,總是包含一個return的語句if(left > right) return -1;int middle = left + (right - left)/2;if(key < a[middle]) bin_search(key, a, left, middle-1);\else if(key > a[middle]) bin_search(key, a, middle+1, right);else return middle; }

編寫遞歸代碼時最重要的有以下三點。

  • 遞歸總有一個最簡單的情況——方法的第一條語句總是一個包含return的條件語句。
  • 遞歸調用總是去嘗試解決一個規模更小的子問題,這樣遞歸才能收斂到最簡單的情況。在上面代碼中,第四個參數和第三個參數的差值一直在縮小。
  • 遞歸調用的父問題和嘗試解決的子問題不應該有交集。在上面代碼中,兩個子問題各自操作的數組部分是不同的。
  • 違背其中任意一條都可能得到錯誤的結果或低效的代碼,而堅持這些原則能寫出清晰,正確且容易評估性能的程序。使用遞歸的另一個原因是我們可以使用數學模型來估計程序的性能。這個要在后面講。

    1.2 練習

    看了遞歸的總結了之后,要做做練習題,控固一些遞歸的知識點,所以就做算法4,第一節的練習題。

    1.1.16 給出exR1(6)的返回值

    string exR1(int n) {if(n < 0) return "";return exR1(n - 3) + n + exR1(n - 2) + n; }int main() {cout << "遞歸代碼學習" << endl;string str = exR1(6);cout << str << endl;return 0; }

    c++好像不知道string加法,不過就這樣吧,我們不執行了,直接推結果。

    這里已經把遞歸的流程分析,遞歸分析不用慌,一層一層分析,知道返回的時候,就有結果了,這道題的答案是:311361142246。

    1.1.17 找出一下遞歸函數的問題

    string exR2(int n) {string s = exR2(n -3)+ n + exR2(n -2)+ n;if(n < 0) return "";return s; }

    這一個是違反了遞歸的第一條性質,也就是第一條不包含return語句,這樣導致遞歸函數一直遞歸,知道把棧搞溢出。

    1.1.18 請看一下遞歸函數

    int mustery(int a, int b) {if(b == 0) return 0;if(b % 2 == 0) return mustery(a+a, b/2);return mustery(a+a, b/2) + a; }

    mustery(2, 25)和mustery(3, 11)的返回值是多少

    這個遞歸比較簡單,只要一個方向遞歸,像第一題兩個方向遞歸才難。

    1.1.19 在計算機上運行一下程序

    long F(int N) {if(N==0) return 0;if(N==1) return 1;return F(N-1)+F(N-2); }

    計算這段程序在一個小時之內能夠得到的F(N)結果的最大N值是多少?這個有誰知道,可以講解一波,我也不清楚。
    開發F(N)的一個更好的實現,用數組保存已經計算過的值。

    long F2(int N, long *value) {//static long *value = new long[N];if(N == 0){value[0] = 0;value[1] = 1;return 0;}if(N == 1){value[0] = 0;value[1] = 1;return 1;}//printf("N %ld %ld %ld\n", N, value[N-1]+value[N-2]);value[N-1] = F2(N-1, value);return value[N-1]+value[N-2]; }

    遞歸函數還是一貫都是開始是return,因為我們要從0,1開始,所以0,1需要做特殊處理,然后從2開始的話,我們就遞歸算出每個數組的值,然后利用已經保存好的數組的值,然后在相加,就得到了想要的結果。

    1.1.20 編寫一個遞歸的靜態方法計算ln(N!)的值

    unsigned long jieceng(int N) {if(N == 1 || N == 0) {return 1;}return jieceng(N-1)*N; }

    這是階乘的答案

    總結

    以上是生活随笔為你收集整理的算法4(一、递归学习)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。