数组 – 如何迭代属于大小为n的同一域的m个变量的所有配置?

编辑:我的解决方案添加到问题的最后.谢谢你的提示.

我只想举个例子.假设我有一个长度为n的数组:

arr = { 1, 4, 8, 2, 5, ... }

如果我想遍历两个元素的所有组合,我会写:

for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        // do something with arr[i] and arr[j]
    }
}

如果我想遍历三个元素的所有配置,我只需添加另一层迭代:

for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        for (int k = 0; k < n; k++) {
            // do something with arr[i] and arr[j]
        }
    }
}

如果元素的数量由用户给出(比如m),我们不确切知道它是什么?那我应该写什么?

(我无法弄清楚这个问题的最佳标题.而且标签也不准确.如果你愿意,也可以帮助我.)

回答
解决方案是这个功能:

void configurations(int depth, int* array, int length, int* indices, int curDepth) {
    if (curDepth == 0) {
        for (int i = 0; i < depth; i++) {
            printf("%d ", indices[i]);
        }
        printf("\n");
        return;
    }

    for (int i = 0; i < length; i++) {
        indices[curDepth - 1] = i;
        configurations(depth, array, length, indices, curDepth - 1);
    }
}

上述功能的用法如下所示:

int a[] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
int configSize = 3;
int* indices = new int[configSize];
configurations(configSize, a, 9, indices, configSize);

控制台将显示数组中给定大小的元素的所有配置:

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

最佳答案 你可以简单地使用
recursion.

一些伪代码:

void someFunction(int[] arr, int n, int depth)
{
  if (depth == 0)
  {
    // do something with the stored elements
    return;
  }

  for (int i = 0; i < n; i++)
  {
    // store arr[i]
    someFunction(arr, n, depth-1);
  }
}

有几种方法可以存储arr [i].一种方法是通过递归调用传递一个大小为initialDepth的数组,以及该数组中的当前索引.我们在每次递归调用时增加索引,并将arr [i]放在当前索引处.然后,当深度== 0 if-statement触发时,我们将有一个包含置换的数组,我们可以做任何事情.

作为您的代码,这将重复元素(即,一个排列将仅由重复几次的第一个元素组成).如果您希望避免这种情况,您可以在第一步将第一个元素与每个其他元素交换,然后递归,在第二步中将每个其他元素交换第二个元素,依此类推.

void someFunction(int[] arr, int n, int pos, int depth)
{
  if (pos == depth)
  {
    // do something with the elements in arr from 0 to pos
    return;
  }

  for (int i = pos; i < n; i++)
  {
    // swap arr[pos] and arr[i]
    someFunction(arr, n, pos+1, depth);
    // swap arr[pos] and arr[i] back
  }
}

使用someFunction调用(inputArray,n,0,desiredDepth).

点赞