我可以遍历大小为1的子集
for( int a = 0; a < size; a++ ) {
Run Code Online (Sandbox Code Playgroud)
或者大小为2的子集
for( int a1 = 0; a1 < size; a1++ ) {
for( int a2 = a1+1; a2 < size; a2++ ) {
Run Code Online (Sandbox Code Playgroud)
或3
for( int a1 = 0; a1 < size; a1++ ) {
for( int a2 = a1+1; a2 < size; a2++ ) {
for( int a3 = a2+1; a3 < size; a3++ ) {
Run Code Online (Sandbox Code Playgroud)
但是如何对大小为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);
}
}
Run Code Online (Sandbox Code Playgroud)
你可以使用递归:
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);
Run Code Online (Sandbox Code Playgroud)