C中置换计算的迭代解

我正在研究处理迭代的问题.我应该将两个int传递给一个函数,它代表了一些N个对象和M值,我必须找到它们的所有排列.我还给出了一个输出应该是什么样子的样本

void perm_iter(int N,int nr_values)
这应该打印的输出是:

Called : perm_iter(3, 2);

0  0  0
0  0  1
0  1  0
0  1  1
1  0  0
1  0  1
1  1  0
1  1  1

通过使用交换函数来改变字符串的顺序以查找字符串的所有排列,我理解递归的概念,但我不确定如何使用迭代来获得相同或类似的结果.这是一个我需要使用堆栈和迭代推/弹来获得我的答案的情况吗?我以为我可以使用类似一组嵌套循环的东西取代递归并获得类似输出的东西,但我不确定如何设置循环以完成每个排列而不仅仅是迭代,缺少一些可能的排列.

任何帮助将不胜感激,谢谢你的时间.

最佳答案 您只需要计算每个“数字”直到达到最大值,然后重置并递增下一个.

想象一下nr_values是10(n = 2):

0 0
0 1 
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9 
1 0
1 1 
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9 

看起来很熟悉,因为在这种情况下它只是“常规”计数.

实现这一点就像你计算一样:在每一步中,增加最左边的值.如果达到最大值,则重置并递增下一个值等.

void perm_iter(int n, int nr_values) {
  int[] counter = new int[n];
  int i;

  // Clear all values
  for (i = 0; i < n; i++) {
    counter[i] = 0;
  }

  do {
    // Print the current set of values
    for (i = 0; i < n; i++) {
      printf("%n ", counter[i]);
    }
    printf("\n");

    // Keep incrementing while the values overflow,
    // starting at the rightmost counter
    i = n - 1;
    while (i >= 0) {
      counter[i]++;
      if (counter[i] < nr_values) {
        break;
      } 
      counter[i] = 0;
      i--;
    }
    // We are done when the first value overflows
  } while (i >= 0);
}
点赞