遍历任何大小的子集 [英] Iterating over subsets of any size
本文介绍了遍历任何大小的子集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我可以遍历大小为1的子集
的for(int a = 0; A<大小; A ++){
或大小为2的子集
的(INT A1 = 0; A1中的大小; A1 ++){
为(中间体A2 = A1 + 1; A2&所述;大小; A2 ++){
或3
的(INT A1 = 0; A1中的大小; A1 ++){
为(中间体A2 = A1 + 1; A2&所述;大小; A2 ++){
为(中间体A3 = A2 + 1; A3&所述;大小; A3 ++){
但如何做到这一点的大小为n的子集?
这做这项工作的基础上,由亚当·罗森菲尔德
答案 无效迭代(INT *一,诠释我,诠释大小,INT N)
{
INT开始= 0;
如果(ⅰ大于0)开始= A [1-1] 1;
为(A [1] =开始; A [1] n种; A [1] ++){
如果(ⅰ==正 - 1){
//一个是大小为n的指数数组
对于(INT K = 0; K<大小; k ++){
的printf(%D,一个[K]);
}
的printf(\ N);
}
其他
迭代(A,I + 1,大小,n)的;
}
}
解决方案
您可以使用递归:
无效迭代(INT *一,诠释我,诠释大小,INT N)
{
为(A [1] = 0;一[1] - ;大小; A [1] ++)
{
如果(ⅰ== N-1)
DoStuff(A,N); //一个是大小为n的指数数组
其他
迭代(A,I + 1,大小,n)的;
}
}
...
//相当于4个嵌套的循环
int的一个[4];
迭代(一,0,大小,4);
I can iterate over the subsets of size 1
for( int a = 0; a < size; a++ ) {
or subsets of size 2
for( int a1 = 0; a1 < size; a1++ ) {
for( int a2 = a1+1; a2 < size; a2++ ) {
or 3
for( int a1 = 0; a1 < size; a1++ ) {
for( int a2 = a1+1; a2 < size; a2++ ) {
for( int a3 = a2+1; a3 < size; a3++ ) {
But how to do this for subsets of size n?
This does the job, based on an answer by 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);
}
}
解决方案
You can use recursion:
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);
这篇关于遍历任何大小的子集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文