【问题标题】:iterative solution to permutation calculation in CC中置换计算的迭代解
【发布时间】:2016-02-01 18:16:15
【问题描述】:

我正在处理一个处理迭代的问题。我应该将两个整数传递给一个函数,它代表我必须找到所有排列的 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

我通过使用交换函数来更改字符串的顺序以查找字符串的所有排列来理解递归的概念,但我不确定如何使用迭代来获得相同或相似的结果。这是我需要使用堆栈并迭代地推送/弹出来获得答案的情况吗?我在想我可以使用一组嵌套循环之类的东西来代替递归并获得类似这样的输出,但我不确定如何设置循环以遍历每个排列,而不仅仅是迭代,错过了一些可能的排列。

我们将不胜感激,感谢您抽出宝贵时间。

【问题讨论】:

  • 那些不是排列,它们都是长度为 3 的字符串,你可以用 2 个符号组成。完全不同的野兽。请说明你想要什么。
  • 这本质上是一个递增的里程表,以 m 为基数。
  • 参数N = 3 在您的示例中似乎以每行三位数字表示。您能否解释一下参数nr_values = 2 在您的示例中的功能?我认为1s 或0ss 的数量可能固定为2,但似乎并非如此。示例中nr_values 对应什么?

标签: c algorithm loops iteration permutation


【解决方案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);
}

【讨论】:

  • 您正在从nr_values 中形成所有可能的n 字符串,这是问题所显示的内容,而不是排列,是问题所陈述的内容。
  • 仅获取排列的一个选项是执行附加扫描,无论该值是否已经在数组中 - 如果是,则跳过它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 2016-12-23
相关资源
最近更新 更多