遞迴和分治思想及其應用

2021-08-02 18:06:03 字數 2862 閱讀 8331

更多

如果可以使用迭代,盡量別使用遞迴。由編譯原理可以知道,每次自呼叫的時候,計算機都需要儲存在呼叫,浪費時間空間。當然,迭代是當我們知道迴圈次數的時候。而當我們不知道迴圈次數,比如說對於資料夾和檔案進行遍歷,不知道深度的情況下,我們就需要遞迴來實現。顯然,遞迴是先解決小的問題,這種思想是分治思想。根據具體需求,來決定是否使用遞迴。

遞迴要注意:- 結構是選擇結構,而迭代是迴圈結構

- 必須有基線條件和遞迴條件,防止出現死迴圈

- 如果知道迴圈次數的話,盡量使用遞迴

- 對於某些程式設計式函式,有對於尾遞迴的迭代優化

- 遞迴邏輯更容易理解

#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 遞迴 歸去來兮 遞迴效率較低,如果明確知道迭代次數,則能用迭代最好用迭代,遞迴是函式自己呼叫自身,每次呼叫都需要入棧等操作。但是遞迴操作要比迭代簡單和清楚。遞迴函式的優點是定義簡單,邏輯清晰。理論上,所有的遞迴函式都可以寫成迴圈的方式,但迴圈的邏輯不如遞迴清晰。使用遞迴函式需要注意防止棧溢位。在...