Наличие логической проблемы с рекурсивными N-вложенными циклами for

0

Я искал и нашел похожие проблемы, но все они, похоже, не соответствовали моим. В принципе, мне нужно написать рекурсивную функцию, которая гнездет цикл 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, чтобы заставить это работать. Любая помощь приветствуется!

Теги:
for-loop
vector
nested
map

2 ответа

0
Лучший ответ
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);
}
  • 0
    Вы имели в виду использовать index [i] <sout [i] .size ()?
  • 0
    да, конечно. исправленный.
0

Почему вы всегда используете sout[1] в рекурсии? Вероятно, это должно быть что-то вроде

for (int i = 0; i < sout[sout.size() - numLoops].size(); ++i)
  • 0
    Я использовал это для тестирования, но замена на переменную больше ничего не делала. Я попробую ваше решение!
  • 0
    Выходные данные я получаю из следующего кода: pastebin.com/WPXQchR4 Так что, похоже, ему не хватает нескольких нулей и тому подобное.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню