看到有人写帖子问如果从m个数组中取N个原始的算法,要求一个是递归的,一个不是递归的。
递归的解法:(比较笨)
非递归的解法:
测试的主程序:
int main()
{
int a[10] = {0, 1,2,3,4,5,6,7,8,9};
int b[20] ={0};
getn(a,b,10,5,0,-1);
agen(a,10,5);
return 0;
}
递归的解法:(比较笨)
void getn(int a[], int b[] , int m, int n, int index,int lastindex)
{
int i = lastindex + 1;
if(index == n )
{
int x;
for(x = 0 ; x < n ;x ++)
{
printf(" %d ",a[b[x]]);
}
printf(" ");
return ;
}
while( i < m)
{
b[index] = i;
getn(a,b,m,n,index + 1,i);
i ++ ;
}
}
{
int i = lastindex + 1;
if(index == n )
{
int x;
for(x = 0 ; x < n ;x ++)
{
printf(" %d ",a[b[x]]);
}
printf(" ");
return ;
}
while( i < m)
{
b[index] = i;
getn(a,b,m,n,index + 1,i);
i ++ ;
}
}
void agen(int a[],int m, int n) /* from m get n */
{
int i ,j ;
int b[100] = {0}; /* big then n */
i = j = 0;
while(b[0] < m ) {
while( i < m) {
if(j == n - 1 ) {
int x ;
for( x = 0 ; x < n ; x ++) {
printf(" %d ",a[b[x]]);
}
printf(" ");
} else {
j ++;
}
i ++;
b[j] = i;
}
do {
j --;
b[j] ++ ;
} while(b[j] >= m );
i = b[j] ;
}
}
{
int i ,j ;
int b[100] = {0}; /* big then n */
i = j = 0;
while(b[0] < m ) {
while( i < m) {
if(j == n - 1 ) {
int x ;
for( x = 0 ; x < n ; x ++) {
printf(" %d ",a[b[x]]);
}
printf(" ");
} else {
j ++;
}
i ++;
b[j] = i;
}
do {
j --;
b[j] ++ ;
} while(b[j] >= m );
i = b[j] ;
}
}
测试的主程序:
int main()
{
int a[10] = {0, 1,2,3,4,5,6,7,8,9};
int b[20] ={0};
getn(a,b,10,5,0,-1);
agen(a,10,5);
return 0;
}
本文提供了一种从m个不同元素中选取N个元素的所有可能组合的方法,包括递归和非递归两种实现方式,并通过示例代码展示了这两种算法的具体实现。

890

被折叠的 条评论
为什么被折叠?



