美文网首页
递归引发的血案

递归引发的血案

作者: 小幸运Q | 来源:发表于2018-06-30 21:45 被阅读9次

    正确写法:

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

    相关文章

      网友评论

          本文标题:递归引发的血案

          本文链接:https://www.haomeiwen.com/subject/mvsxuftx.html