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

时间:2012-09-18 14:29:10

标签: 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 ", 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;
}

问题是不是打印它们我想将每个排列添加到2D数组。目前,我正在将排列打印到文件,然后将其读取到2D数组,但我认为应该有更好的方法来实现这一点。

4 个答案:

答案 0 :(得分:1)

使用动态数组。值得庆幸的是,您事先了解了阵列的总大小:

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次致电nf。在您的计划结束时,请说free(array);

数组的k th 行包含array[k * n]元素,最多array[k * n + n],零基础和半开公约。

答案 1 :(得分:1)

将这些声明为全球:

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++;
}

答案 2 :(得分:0)

我不确定我是否理解这个问题。只需创建一个数组或列表,并直接从您的函数中引用它。就像你从任何其他函数访问数组或列表一样。

或者,您可以将数组或列表作为参数传递,并在每次递归调用该函数时传递该参数。

答案 3 :(得分:0)

由于您可以提前知道有多少个排列(n!表示长度为n的数组),您可以预先创建此数组,然后将其传递给递归函数。递归函数可以给出一个参数,告诉它它正在生成n'th置换,以便在写入包含所有排列的数组时它知道正确的索引。所以算法是这样的(伪代码提前):

void doPermute( array, arrayLen, n, permutations ) {
  if ( n < fact(arrayLen) ) {
    /* At this point, generate permutation of array and write it to
     * permutations[n].
     */

    /* Recurse, generating next permutation. */
    doPermute( array, arrayLen, n + 1, permute );
  }
}

int **permute( array, arrayLen ) {
  /* Allocate an array big enough to hold `arrayLen!` versions of the input
   * array.
   */
  int **permutations = malloc( fact( arrayLen ) * (sizeof(int) * arrayLen) );

  /* Invoke recursion */
  doPermute( array, arrayLen, 0, permutations );
}