2015-11-01 84 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