總所周知,我們使用搜索以及許多算法,都要用到遞歸,遞歸的使用要弄明白並不難,但是想要理解搜索中dfs的使用就要理解一番,
以如下代碼為例:
void dfs(int x,int step,int s) {
//限制條件1,當步數相等時,即返回;
//即有一個條件,來限制;
//dfs的核心 if(step==cnt) { ans=min(s,ans); return ; }
//剪枝1;不具體介紹了
//減少復雜度的重中之重 if(s>ans) return ;
//dfs中的具體實現過程 for(int i=1;i<=cnt;i++) { if(vist[i]) continue ; vist[i]=1;
/*重點講下搜索中筆者對遞歸的理解
dfs使用遞歸,即遞歸定義,自己調用自己;
當你進入dfs函數中,即類進入新的函數;
當函數結束時或是達到限定條件時就返回;
即如 此函數,若是結束就for循環找下一個結點;
直到找完所有結點;記錄下最小的s;
當然若是只要求找到結點,未要求最小,便可添加條件,用bool判斷,當找到令其為true;
即為判斷條件,退出搜索;
遞歸結束;
講的比較啰嗦,主要是為了能夠用程序思維去編寫算法題來理解做准備;
*/ dfs(i,step+1,s+dis[x][i]); vist[i]=0; } }