编辑:我的解决方案添加到问题的最后.谢谢你的提示.
我只想举个例子.假设我有一个长度为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).