c - 如何使用递归打印出 C 中一系列数字的所有排列?

标签 c arrays algorithm recursion permutation

我正在尝试制作一个递归函数,该函数将打印出具有整数数组重复项的所有排列,但数字有一个范围,数组大小也有范围。假设我们有一个数组 num[2],它的范围是 0-1,例如,它会打印出类似

的内容
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 大小的数字范围?

我的问题与这里的另一个问题不同,因为我没有一个包含值的集合数组,示例代码就是这样做的,但我需要的是帮助打印 k 数组中范围 n 的所有排列点,所以说 n 是 3,k 是 3 那么它就是

000
001
002
003
010
011
etc...

最佳答案

根据您的要求,您希望为每个包含 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;
}

关于c - 如何使用递归打印出 C 中一系列数字的所有排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32934625/

相关文章:

c - 通过 fputc 与 C 中的 fwrite 数组写入文件

c++ - 在有向图中通过 bfs 搜索显示最短路径

algorithm - 将名称排序列表转换为等级排序列表

c++ - 为什么结构的 sizeof 不等于每个成员的 sizeof 之和?

c - 在 C 结构体中存储字符串

python - 从 3 维数组中选择一个 2 维数组

c# - 使用值编码 C# 的遗传算法初始种子多样性

mysql - 使用 C api 解决 MYSQL 截断问题

c - 在ubuntu中使用sigaction()实现Signal()

C - 为什么指向指针的指针与指向数组的指针不同?