c++ - 遍历任意大小的子集

标签 c++ algorithm

我可以迭代大小为 1 的子集

for( int a = 0; a < size; a++ ) {

或大小为 2 的子集

for( int a1 = 0; a1 < size; a1++ ) {
    for( int a2 = a1+1; a2 < size; a2++ ) {

或3

for( int a1 = 0; a1 < size; a1++ ) {
for( int a2 = a1+1; a2 < size; a2++ ) {
   for( int a3 = a2+1; a3 < size; a3++ ) {

但是如何对大小为 n 的子集执行此操作?

根据 Adam Rosenfield 的回答,这可以完成工作

void iterate(int *a, int i, int size, int n)
{
 int start = 0;
 if( i > 0 ) start = a[i-1]+1;
 for(a[i] = start; a[i] < n; a[i]++) {
  if(i == n-1) {
      // a is the array of indices of size n
      for( int k = 0; k < size; k++ ) {
          printf("%d ",a[k]);
      }
      printf("\n");
  }
        else
            iterate(a, i+1, size, n);
    }
}

最佳答案

你可以使用递归:

void iterate(int *a, int i, int size, int n)
{
    for(a[i] = 0; a[i] < size; a[i]++)
    {
        if(i == n-1)
            DoStuff(a, n);  // a is the array of indices of size n
        else
            iterate(a, i+1, size, n);
    }
}
...
// Equivalent to 4 nested for loops
int a[4];
iterate(a, 0, size, 4);

关于c++ - 遍历任意大小的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1683241/

相关文章:

algorithm - 逐字母搜索背后的数据结构是什么?

C++ 编写自己的输入操纵器

c++ - 我可以在 for 循环的 init-expression 中使用不同的类型吗?

c++ - 获取未删除指针的值

algorithm - 找出区间内绝对差值最小的两个元素

将 2d 多边形最佳分割(即镶嵌/分区)到更小的多边形的算法?

c++ - 阻止以编程方式运行的系统命令的标准错误输出

c++ - 新手 : C++ Private Variables

c# - 多调和样条实现c#

C++、count_if 和 equals