2015-11-01 101 views
1

我正在處理遞歸問題。我應該將兩個int傳遞給一個函數,它代表了N個對象和M個值,我必須找到所有的排列。我也給什麼樣的輸出應該看起來像遞歸算法打印給定顯示?

void perm_rec_1(int N, int nr_values) 

,這應該是打印輸出的樣本爲:

Called : perm_rec_1(3, 2); 

0 0 0 
0 0 1 
0 1 0 
0 1 1 
1 0 0 
1 0 1 
1 1 0 
1 1 1 

我瞭解遞歸的概念通過使用交換功能更改字符串的順序以查找字符串的所有排列,但我不確定如何在此處應用它,或者如果它甚至可以。它看起來像數組通過改變數組的結尾,將元素增加1,直到nr_vals-1。 任何幫助將不勝感激,並感謝您的時間。

+0

這樣的問題更容易用循環修復。它只是基於「nr_values」和「N」數字進行計數,任何遞歸只會比平坦循環更復雜,當您有固定數量的應該被置換的元素時,遞歸更有用(在這裏您可以找到所有組合都是「計數「) – GameDeveloper

+0

至少有編程語言? – GameDeveloper

+1

我正在使用c。我同意你的看法,而這也是我需要做的。我需要完成的任務是找到這些排列以及迭代(循環)算法的遞歸設計。我想我接近於解決迭代的問題。 – JustaRedShirt

回答

1

既然你不提及任何語言這裏的C++版本:

#include <iostream> 

void perm_rec_1_aux(int *values, int N, int nr, int curr, int idx); 
void print_val(int * values, int N); 

void perm_rec_1(int N, int nr){ 
    int * values = new int[N]; //replace with malloc for C 
    for(int i= 0; i<nr; i++) 
     perm_rec_1_aux(values, N, nr, i, 0); 

    delete [] values; //replace with free for C 
} 

void print_val(int * values, int N){ 
    // use printf for C 
    for(int i = 0; i<N; i++) 
     std::cout<< values[i]<<" "; 
    std::cout<<std::endl; 
} 

void perm_rec_1_aux(int *values, int N, int nr, int curr, int idx){ 
    values[idx] = curr; 

    if(idx+1 == N) 
     return print_val(values, N); 

    for(int i=0; i<nr; i++) 
     perm_rec_1_aux(values, N, nr, i, idx+1); 
} 

int main() { 
    perm_rec_1(3, 2); 
    std::cout<<"--\n"; 
    perm_rec_1(2, 3); 
    return 0; 
} 

輸出:

0 0 0 
0 0 1 
0 1 0 
0 1 1 
1 0 0 
1 0 1 
1 1 0 
1 1 1 
-- 
0 0 
0 1 
0 2 
1 0 
1 1 
1 2 
2 0 
2 1 
2 2 
+0

謝謝噓! – JustaRedShirt

+0

不要忘了接受答案然後:) – GameDeveloper

0

所以出於好奇,會循環(迭代)的版本是什麼樣子? 我假設它是基於N和nr_vals的嵌套循環?

+0

加1到最右邊的值,如果它變成= nr然後將它設置爲零並立即給它加1以便立即值,依此類推。應該是2/3循環 – GameDeveloper