C 如何在递归算法中将结果添加到数组中?
我使用递归算法列出数组p={1,2,3}中所有可能的元素排列。以下是我正在使用的简单递归实现:C 如何在递归算法中将结果添加到数组中?,c,recursion,C,Recursion,我使用递归算法列出数组p={1,2,3}中所有可能的元素排列。以下是我正在使用的简单递归实现: void swap(int x, int y){ int temp = array[x]; array[x]=array[y]; array[y]=temp; return; } void printArray(int size){ int i; for (i=0;i<size;i++) printf("%d ", ar
void swap(int x, int y){
int temp = array[x];
array[x]=array[y];
array[y]=temp;
return;
}
void printArray(int size){
int i;
for (i=0;i<size;i++)
printf("%d ", array[i]);
printf("\n");
return;
}
void permute(int k,int size){
int i;
if (k==0)
printArray(size);
else{
for (i=k-1;i>=0;i--){
swap(i,k-1);
permute(k-1,size);
swap(i,k-1);
}
}
return;
}
无效交换(整数x,整数y){
int temp=数组[x];
数组[x]=数组[y];
数组[y]=温度;
返回;
}
无效打印数组(整数大小){
int i;
对于(i=0;i=0;i--){
互换(i,k-1);
排列(k-1,大小);
互换(i,k-1);
}
}
返回;
}
问题是,我不想打印它们,而是要将每个排列添加到2D数组中。目前,我正在将排列打印到一个文件中,然后将其读取到一个2D数组中,但我认为应该有更好的方法来实现这一点。我不确定我是否理解这个问题。只需创建一个数组或列表,并直接从函数中引用它。就像从任何其他函数访问数组或列表一样
或者,可以将数组或列表作为参数传递,每次递归调用函数时只需传递该参数。使用动态数组。谢天谢地,您提前知道了阵列的总大小:
size_t const n = 3; // array size, e.g. [ 0, 1, 2 ]
size_t const nf = factorial(n); // number of permutations
int * array = malloc(nf * n * sizeof *array); // space for a flat array of n*nf
size_t cur = 0; // current row
void add_row(int * src)
{
for (size_t i = 0; i != n; ++i)
{
array[cur * n + i] = src[i];
}
++cur;
}
您必须准确地调用add_row
次。在程序结束时,说free(数组)代码>
数组的k
第行包含元素array[k*n]
最多array[k*n+n]
,以零为基础,采用半开放约定。因为您可以提前知道有多少排列(n!
对于长度n
的数组)您可以预先创建这个数组,然后将它传递给递归函数。可以给递归函数一个参数,告诉它正在生成第n个排列,这样它在写入包含所有排列的数组时就知道正确的索引。所以算法是这样的(前面的伪代码):
void doPermute(数组、数组、n、置换){
if(n
将其声明为全局:
int **resultArray;
resultArray = malloc( (n!) * sizeof(int *)); // n! : factorial of n
for(i=0; i<(n!); i++)
resultArray[i] = malloc(size * sizeof(int));
int index = 0;
int**resultArray;
resultArray=malloc((n!)*sizeof(int*);//n!:n的阶乘
对于(i=0;请注意,n!
不是有效的C代码,您必须创建一个计算n的阶乘的函数。同样请.aha,,这就是为什么我在它旁边添加了一个注释,它是n的阶乘:)、和thnx,用于2D声明:)
int **resultArray;
resultArray = malloc( (n!) * sizeof(int *)); // n! : factorial of n
for(i=0; i<(n!); i++)
resultArray[i] = malloc(size * sizeof(int));
int index = 0;
void addToArray(int size){
int i;
for(i=0 ; i<size ; i++)
resultArray[index][i] = array[i];
index++;
}