遞迴演算法,說白了就是程式呼叫自身的程式設計技巧的一種演算法。
它能更好的實現一種反覆執行的過程(呼叫自身的方式),能讓一些反覆迴圈的問題變得簡單化,使之更好的讓計算機運算出結果。
遞迴需滿足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陣列,標記已訪問過的頂...