如何编写从M中选N的组合数程序,一个不用递归方法设计,一个用递归方法设计

     看到有人写帖子问如果从m个数组中取N个原始的算法,要求一个是递归的,一个不是递归的。
递归的解法:(比较笨)
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 
++  ;
        }

 非递归的解法:
 
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 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;
}

你可能感兴趣的:(算法,测试,IM)