遞迴演算法及DFS搜尋的應用

2021-08-10 07:11:35 字數 852 閱讀 6551

遞迴演算法,說白了就是程式呼叫自身的程式設計技巧的一種演算法。

它能更好的實現一種反覆執行的過程(呼叫自身的方式),能讓一些反覆迴圈的問題變得簡單化,使之更好的讓計算機運算出結果。

遞迴需滿足2個條件:

1)有反覆執行的過程(呼叫自身)

2)有跳出反覆執行過程的條件(遞迴出口)

一般來說,遞迴需要有邊界條件、遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進;當邊界條件滿足時,遞迴返回。

遞迴演算法一般用於解決三類問題:

(1)資料的定義是按遞迴定義的。(如fibonacc函式,回文數)

(2)問題解法按遞迴演算法實現。(如回溯法,bfs,dfs)

(3)資料結構形式是按遞迴定義的。(樹的遍歷,圖的搜尋)

遞迴設計要點及步驟:

(1)根據實際構建遞迴關係

(2)確定遞迴邊界,遞迴返回段*

(3)分析遞迴關係,編寫遞迴函式,遞迴前進段(有時可以從後往前推——逆向思維)

(4)設計主函式呼叫遞迴函式

下面舉一種基於遞迴演算法的dfs搜尋方式:

下面是1到9全排列的dfs遞迴演算法:

int dfs(int  n)

if(n==10)  //跳出深度狀態的條件

if(需要所滿足的條件)  

count++;

return count;

else

for(int i=1;i<=9;i++)

int ok=1;

for(int j=1;jif(num[j]==i) ok=0;  //檢查當前放置的數字是否在此之前放置過( 全排列不能允許有相同的數)

if(ok)

num[n]=i;

dfs[n+1];

搜尋DFS演算法

dfs 深度搜尋法 1.首先確定深度或搜尋終點 2.利用函式遞迴 適當做回溯 缺點 難以找到最優解但占用記憶體小 例題1 oil deposits 經典連通塊問題 ac include include include using namespace std char tian 101 101 int...

非遞迴dfs演算法

都說現今記憶體不值錢了,哈,也就不考慮空間複雜度的問題了,弄了倆輔助陣列,覺得解這題還是挺容易的,就是不知道有沒有bug。問題描述 假設圖g採用鄰接表儲存,編寫乙個實現連通圖g的深度優先遍歷 從頂點v出發 的非遞迴演算法。演算法思路 就是深度優先的思路。同樣是乙個visited陣列,標記已訪問過的頂...

非遞迴dfs演算法

都說現今記憶體不值錢了,哈,也就不考慮空間複雜度的問題了,弄了倆輔助陣列,覺得解這題還是挺容易的,就是不知道有沒有bug。問題描述 假設圖g採用鄰接表儲存,編寫乙個實現連通圖g的深度優先遍歷 從頂點v出發 的非遞迴演算法。演算法思路 就是深度優先的思路。同樣是乙個visited陣列,標記已訪問過的頂...