算法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; }編寫遞歸代碼時最重要的有以下三點。
違背其中任意一條都可能得到錯誤的結果或低效的代碼,而堅持這些原則能寫出清晰,正確且容易評估性能的程序。使用遞歸的另一個原因是我們可以使用數學模型來估計程序的性能。這個要在后面講。
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)的一個更好的實現,用數組保存已經計算過的值。
遞歸函數還是一貫都是開始是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(一、递归学习)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pdf 复制文本 乱码_如何在保留格式的
- 下一篇: Guri团队的侧信道攻击研究