DSP

使用递归实现n重循环

2019-07-13 20:46发布

         这里的n是不确定的。        实现的功能描述如下: 1.        有一个字符串的矩阵,用vector< vector< CStirng > > 表示 2.        行与行之间进行排列组合 3.        输出所有组合的方式   int loop( VEC_DYADIC_STRING vecDyadic,    // 字符串矩阵           int& nMax,                     // 记录未遍历的行号           int& nCurDeep,                 // 当前行数(也可以称为深度)           VEC_INT& vecInt,               // 记录所有行号           VEC_INT& vecInt2 )             // 记录每一行选中的 {      vecInt.push_back( nCurDeep );      for ( UINT i = 0; i < vecDyadic[nCurDeep].size(); i++ )      {          if ( nMax > 1 )    // 如果不是最后一行          {               nMax--;               nCurDeep++;               vecInt2.push_back( i );               loop( vecDyadic, nMax, nCurDeep, vecInt, vecInt2 );          }          else          {               //char* pData;               //USES_CONVERSION;               //pData = T2A( vecDyadic[nCurDeep][i] );               for ( UINT j = 0; j < vecInt2.size(); j++ )               {                    cout<<vecDyadic[vecInt[j]][vecInt2[j]]<<_T( " " );               }               cout<<vecDyadic[nCurDeep][i]<<endl;               nOutNum++;                           // 全局变量,记录循环的次数,也就是排列组合的次数。          }      }      deleteVecBehindSepVal( vecInt, nCurDeep );     // 最后一层for循环执行完毕,需要回到上一层,上一层的循环数加1,这需要修改Vector中保存的记录,所以需要将该层(包括该层)之后的记录删除。      nMax++;      nCurDeep--;      deleteVecBehindSepVal( vecInt2, nCurDeep );    // 同理        return 0; }   deleteVecBehindSepVal是自定义的函数,Function is 删除Vector中指定位置之后的元素。   经测试,对于字符串矩阵 Apple    Orange   banana car      bus      taxi      bicycle basketball    football      badminton     tennis   volleyball 共输出60条记录。 源代码参考: 我的资源 递归实现n重循环