更多
如果可以使用迭代,盡量別使用遞迴。由編譯原理可以知道,每次自呼叫的時候,計算機都需要儲存在呼叫,浪費時間空間。當然,迭代是當我們知道迴圈次數的時候。而當我們不知道迴圈次數,比如說對於資料夾和檔案進行遍歷,不知道深度的情況下,我們就需要遞迴來實現。顯然,遞迴是先解決小的問題,這種思想是分治思想。根據具體需求,來決定是否使用遞迴。遞迴要注意:- 結構是選擇結構,而迭代是迴圈結構
- 必須有基線條件和遞迴條件,防止出現死迴圈
- 如果知道迴圈次數的話,盡量使用遞迴
- 對於某些程式設計式函式,有對於尾遞迴的迭代優化
- 遞迴邏輯更容易理解
#include
using
namespace
std;
void print()
int main()
很多時候我們需要查詢乙個陣列中是否有乙個元素。如果使用迭代,肯定十分簡單,時間複雜度為o(n)。實現思路:此時,如果使用分而治之的思想,我們可以使用二分法來進行查詢。不論多大的資料,時間複雜度顯著降低為o(log_2 n)。也就是說乙個大小為123456789的陣列,使用迭代,我們需要123456789個時間單位。但是二分法只需要27次。
1.首先轉化的思想對陣列進行排序。如果不排序,那麼low和high就沒有意義了。
2. 再用迭代進行二分
#include
#include
using
namespace
std;
const
int size = 5;
const
int none = -1;
//二分查詢並且返回element的位置,沒查詢到則返回none
template
int binfind(t *arr,int low,int high,t elem)
}int main()
首先我們假設需要移動64層,那麼思路如下(附截圖):
此時,需要解決兩個問題(附截圖):
一直這樣類推,知道最後從begin(開始柱子)->end(目標柱子)。
按照第一張截圖,我們可以寫出來函式裡面else的遞迴部分。並且,每次輸出的時候,就對應著思路裡面的移動(而不是分治),此時step步數需要加+。
#include
#include
using
namespace
std;
void hanoi(int num,char begin,char by,char end,int &step)
}int main()
在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。正規的方法是遞迴,如果不考慮效率,這裡採用遞迴實現。假設從第一行開始,每一行都找到符合條件的乙個位置,而條件就是新的一行的新位置符合要求,以此類推,就可以寫出來遞迴函式。
#includeusing namespace std;
const
int q_num = 8;
int queens[q_num][q_num] = ;
int result = 0;
void print()
/**************其他時候,需要考慮上面的同一列、左上角斜線、右上角斜線,以下分別實現*****/
for(int i=0;iif(queens[i][col]==1)
return
false;
for (int i=row-1,j = col-1;i>=0 && j>=0;--i,--j)
if(queens[i][j]==1)
return
false;
for(int i=row-1,j=col+1;i>=0 && jif(queens[i][j]==1)
return
false;
/******當所有情況都滿足********/
queens[row][col] = 1;
return
true;
}void queen(int row)
for(int i=0;i//i代表列數
if(ifqueen(row,i)) //如果row行i列可以放得話,判斷下一行
queen(row+1);
queens[row][i] = 0; //重置為0,防止下次結果干擾
}}int main()
毫無疑問,遞迴以及分治思想還有很多用法:斐波那契數列、快速排序、檔案查詢、字典樹的建立等等。理論上遞迴可以解決任何問題,而作為我們只需要提供思路,其他的交給計算機解決。所以聽人說過計算機最適合解決遞迴問題。但是,有利有弊,遞迴同樣會消耗更多的記憶體。在初步實現階段,將大問題分而治之,分裝成遞迴函式,還是邏輯**化的最佳表達。csdn位址 :
也可以致信進行交流 : [email protected]
遞迴和分治思想及其應用
目錄 更多 如果可以使用迭代,盡量別使用遞迴。由編譯原理可以知道,每次自呼叫的時候,計算機都需要儲存在呼叫,浪費時間空間。當然,迭代是當我們知道迴圈次數的時候。而當我們不知道迴圈次數,比如說對於資料夾和檔案進行遍歷,不知道深度的情況下,我們就需要遞迴來實現。顯然,遞迴是先解決小的問題,這種思想是分治...
遞迴和分治思想及其應用
目錄更多 如果可以使用迭代,盡量別使用遞迴。由編譯原理可以知道,每次自呼叫的時候,計算機都需要儲存在呼叫,浪費時間空間。當然,迭代是當我們知道迴圈次數的時候。而當我們不知道迴圈次數,比如說對於資料夾和檔案進行遍歷,不知道深度的情況下,我們就需要遞迴來實現。顯然,遞迴是先解決小的問題,這種思想是分治思...
遞迴和分治思想(折半查詢)
1 遞迴 歸去來兮 遞迴效率較低,如果明確知道迭代次數,則能用迭代最好用迭代,遞迴是函式自己呼叫自身,每次呼叫都需要入棧等操作。但是遞迴操作要比迭代簡單和清楚。遞迴函式的優點是定義簡單,邏輯清晰。理論上,所有的遞迴函式都可以寫成迴圈的方式,但迴圈的邏輯不如遞迴清晰。使用遞迴函式需要注意防止棧溢位。在...