2015-10-04 65 views
0

我想做一个递归函数,它会打印出所有具有整数数组重复项的排列,但是数字有一个范围,数组大小的范围也是如此。假设我们有一个数组num[2],它有从0-1例如一个范围,它会打印出像如何使用递归打印出C中所有数字范围的排列?

00 
01 
11 
10 

如果它是一个简单的排列,我可以用一个简单的置换函数是这样的:

void permute(int *array,int i,int length) { 
    if (length == i){ 
    printArray(array,length); 
    return; 
    } 
    int j = i; 
    for (j = i; j < length; j++) { 
    swap(array+i,array+j); 
    permute(array,i+1,length); 
    swap(array+i,array+j); 
    } 
    return; 
} 

void swap(char *x, char *y) 
{ 
    char temp; 
    temp = *x; 
    *x = *y; 
    *y = temp; 
} 

但是我怎样才能使它通过一个数组的范围与数组给定的大小说n大小?

我的问题是不同的另一个在这里,因为我没有一个数组的值是什么,示例代码这样做,但我需要的是帮助打印范围n的所有排列的数组ķ点,所以说,n为3,k为3,那么这将是

000 
001 
002 
003 
010 
011 
etc... 
+0

你能共享交换功能吗? – 2015-10-04 14:42:35

+0

void swap(int * x,int * y) { int temp; temp = * x; * x = * y; * y = temp; } – F22lightning

+0

我无法理解“我”变量。那是什么 ? – 2015-10-04 15:14:06

回答

0

基于你问什么,你想与n元素每个阵列与k元素生成的数组,打印所有n^k排列。所以在每个位置i我们必须把数组的每个元素,并继续为下一个。像这样的代码:

void permute(int *array, int *result, int i, int n, int length) { 
    if (length == i){ 
     printArray(result, length); 
     return; 
    } 

    for (int j = 0; j < n; j++) { 
     result[i] = array[j]; 
     permute(array, result, i + 1, n, length); 
    } 
} 

int main() 
{ 
    int a[] = { 0, 1, 2 }, b[2]; 
    permute(a, b, 0, 3, 2); 
    return 0; 
} 
+0

这似乎在大多数情况下工作,除非有问题,出于某种原因,当尝试使用4和6有时可以使用,其他时间不使用 – F22lightning

+0

你的意思是不行吗?有什么问题? – AKJ88

0

想法是通过每一个可能位级联到每个长度n-1的排列,以产生长度n的排列。所以,如果你有数字0-2,并要生成长度为3的排列,首先产生长度为2的所有排列,然后追加或预先准备的数字01,并且2每个那些:

长度2的置换是:00,01,02,10,11,12,20,21,22

因此,长度3的置换是: 022,100,101,102,110,111,112,120,121,122,200 ...

那么,如何生成长度为2的所有排列呢?您生成长度为1的排列,并将每个数字前置到所有这些排列中。你如何产生长度为1的排列?没有长度为0的排列,因此您只需列出数字。

这里是伪代码:

permute(n, digits) { 
    permutations = [] 
    smaller_permutations = permute(n-1, digits) 
    for (i in digits) { 
     if (length(smaller_permutation > 0) { 
      for (j in smaller_permutations) { 
       insert concatenate(i,j) into permutations 
      } 
     } 
     else { 
      insert i into permutations 
     } 
    } 
    return permutations 
}