2013-10-08 59 views
0

我已經搜索並發現了類似的問題,但他們都似乎不適合我的。基本上,我需要編寫一個遞歸函數,它嵌套一個循環N次,並僅在最後一個循環中打印所有內容。如果你能找到解決問題的另一個解決方案,那會很好。與基於遞歸的N嵌套for循環有一個邏輯問題

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; 
    } 
} 

然而,結果是「我」給是非常難以理解的,我遇到了麻煩循環的正確結構/如果聲明讓這個工作。任何幫助表示讚賞!

回答

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] user2859815

+0

是的,是cource的。糾正。 – Walter

0

爲什麼你總是在遞歸中使用sout[1]?它可能應該是像

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

我使用測試,但有一個變量替換沒有做別的了。我會嘗試你的解決方案! – user2859815

+0

我從以下代碼獲得的輸出:http://pastebin.com/WPXQchR4所以它看起來像缺少了幾個0等。 – user2859815