递归引发的血案

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些在了循环外面,避免了循环中断。

上一篇下一篇

猜你喜欢

热点阅读