Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在递归算法中将结果添加到数组中?_C_Recursion - Fatal编程技术网

C 如何在递归算法中将结果添加到数组中?

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

我使用递归算法列出数组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 ", 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++;
}