Recursion 打印给定显示的递归算法?
我正在研究一个关于递归的问题。我应该把两个整数传递到一个函数中,这个函数表示N个对象和m个值,我必须找到这些对象的所有排列。我还得到了输出应该是什么样子的示例Recursion 打印给定显示的递归算法?,recursion,permutation,Recursion,Permutation,我正在研究一个关于递归的问题。我应该把两个整数传递到一个函数中,这个函数表示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 我理解递归的概念,通过使用交换函数来改变字符串的顺序以
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,从而改变数组的结尾。
如果您没有提到任何语言,这里是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;
}
出于好奇,循环(迭代)版本会是什么样子?
我假设它是基于N和nr值的嵌套循环?这样的问题更容易用循环解决。它只是用“N”数字计算基数“nr_值”,任何递归都会比普通循环更复杂,当你有固定数量的元素应该被置换时,递归更有用(这里你只找到所有的组合,这是“计数”),这是编程语言?我用的是c。我同意你的看法,这也是我需要做的。我需要完成的任务是找到这些排列的递归设计以及迭代(循环)算法。我想我已经接近解决迭代的问题了。如果这个问题可以用循环方法解决=>recursive立即跟进。如果问题只能通过recursive=>解决,那么唯一的循环解决方案需要使用堆分配的stackadd 1到最右边的值,如果它变为=nr,则将其设置为零,并立即将1添加到左边的值,依此类推。应该是2/3圈
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