【问题标题】:Having a logical issue with recursion-based N-nested for loops基于递归的 N 嵌套 for 循环存在逻辑问题
【发布时间】:2013-10-15 19:41:57
【问题描述】:

我已经搜索并发现了类似的问题,但它们似乎都不适合我的问题。基本上,我需要编写一个递归函数,将循环嵌套 N 次,并仅在最后一个循环上打印所有内容。如果您能找到解决问题的其他方法,那就太好了。

0 = *
1 = +
2 = ABC
3 = DEF
...
8 = STU
9 = VWXYZ

这里是完整代码:http://pastebin.com/2YdQ693N

这是一个硬编码的 N=3 示例:

//sout is a vector<string>

for(int i = 0; i < sout[0].size(); i++)
{
    for(int j = 0; j < sout[1].size(); j++)
    {
        for(int k = 0; k < sout[2].size(); k++)
        {
            cout << sout[0][i] << sout[1][j] << sout[2][k] << endl;
        }
    }
}

此特定示例的以下输出(输入为“123”):

+AD
+AE
+AF
+BD
+BE
+BF
+CD
+CE
+CF

我来这里之前最接近的是一个类似于这里的递归函数:http://v2.cplusplus.com/forum/beginner/68434/,但我无法让它适用于我的情况。

我需要索引按这种顺序排列:

000
001
002
010
011
012
020
021
022

除了长度必须是可变的(因此高度也是可变的)。

这是我迄今为止一直在尝试的递归函数:

void recurseLoop(const vector<string>& sout, int numLoops)
{
    if(numLoops > 0)
    {
        for(int i = 0; i < sout[1].size(); i++)
        {
            //cout << i;
            recurseLoop(sout, numLoops - 1);
        }
    }
    else
    {
        //cout << endl;
        return;
    }
}

但是,'i' 给出的结果非常难以理解,我无法获得正确的循环/if 语句结构以使其正常工作。任何帮助表示赞赏!

【问题讨论】:

    标签: c++ for-loop vector map nested


    【解决方案1】:
    void recursion(int N, const vector<string>&sout, vector<int>&index, int I=0)
    {
      if(I<N-1)
        for(index[I]=0; index[I]<sout[I].size(); index[I]++)
          recursion(N,sout,index,I+1);
      else if(I==N-1)
        for(index[I]=0; index[I]<sout[I].size(); index[I]++) {
          for(int k=0; k<N; ++k)
            std::cout << sout[k][index[k]];
          std::cout << std::endl;
        }
    }
    
    void loop_N_times(const vector<string>&sout)
    {
      std::vector<int> index(sout.size());
      recursion(sout.size(),sout,index,0);
    }
    

    【讨论】:

    • 你的意思是使用 index[i]
    【解决方案2】:

    为什么你总是在递归中使用sout[1]?应该是这样的

    for (int i = 0; i < sout[sout.size() - numLoops].size(); ++i)
    

    【讨论】:

    • 我用它来测试,但是用变量替换并没有做太多其他事情。我会试试你的解决方案!
    • 我从以下代码得到的输出:pastebin.com/WPXQchR4 所以看起来它缺少几个 0 等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    相关资源
    最近更新 更多