使用递归实现n重循环

来源:互联网 发布:乐高天启淘宝 编辑:程序博客网 时间:2024/06/10 19:42
 
       这里的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重循环