递归引发的血案
2018-06-30 本文已影响9人
小幸运Q
正确写法:
// 根据parent列表,从end到begin自底向上DFS遍历
void DFS_Path(vector<vector<int>>&parent,vector<int>&s,int start,int& max_group,int& max_calc){
// 堆栈用来存储DFS的路径
int i,j;
// 触底
if(start==begining){
max_group++;
//s.push_back(begining);
//show(s);
// clacmax(s,max_calc);
int might=0;
for(i=s.size()-1;i>=0;i--){
//cout<<">>"<<s[i];
might+=saver[s[i]];
}
if(might>max_calc){
max_calc=might;
}
//s.pop_back();
return;
}
// 未触底
for(i=0;i<parent[start].size();i++){
s.push_back(parent[start][i]);
DFS_Path(parent,s,parent[start][i],max_group,max_calc);
s.pop_back();
}
}
错误写法:
void DFS_Path(vector<vector<int>>&parent,vector<int>&s,int start,int& max_group,int& max_calc){
// 堆栈用来存储DFS的路径
int i,j;
for(i=0;i<parent[start].size();i++){
// 未触底
if(parent[start][i]!=begining){
s.push_back(parent[start][i]);
DFS_Path(parent,s,parent[start][i],max_group,max_calc);
s.pop_back();
}
// 触底
else{
max_group++;
s.push_back(parent[start][i]);
// show(s);
// clacmax(s,max_calc);
int might=0;
for(i=s.size()-1;i>=0;i--){
//cout<<">>"<<s[i];
might+=saver[s[i]];
}
if(might>max_calc){
max_calc=might;
}
s.pop_back();
return;
}
}
return;
}
两种DFS递归的写法差异在于:
错误的写法把if...return写在了for循环里面,没有function保护情况下导致for循环中断,最后少遍历了几个解最后出错。
正确的写法把if...return些在了循环外面,避免了循环中断。