C语言递归

/*
程序作用:从集合{1,2,3,4,5}中选择k个元素的所有组合方式,k由用户输入
程序设计者:calm
程序设计时间:2007-12-14
程序思想:假设集合有n个元素,选出k个元素,可以递归思想来考虑,即将集合分为第1个和后面(n-1)两个部分
如果包含第1个,则从后面的(n-1)个元素中选出(k-1)个来组合;如果集合不包含第1个元素,则从后面的(n-1)
个元素中选出k个元素组合。
*/
#include<stdio.h>
int m[5],j,len;  //定义全局整形变量j,全局整形数组m[5]用来存放找出的元素组合,len表示要选出子集的个数
/*
定义Comb(int p[],int n,int i,int k)
p[]为集合{1,2,3,4,5},n为集合的个数,i为从第i个元素开始寻找,k为所找元素个数
*/
void Comb(int p[],int n,int i,int k) 
{
 if(k==0)
 {
  for(j=0;j<5;j++) //循环输出选出组合
  {
   if(m[j]!=0)
   printf("%d ",m[j]);
  }
  printf("\n");
 }
 else
 {
  if(k<=n-i)
  {
   m[j]=p[i];
   j++;
   Comb(p,n,i+1,k-1); //递归开始
   j=len-k;
   Comb(p,n,i+1,k);
  }
 }
}
void main()
{
 int i,k,a[5]={1,2,3,4,5};
 printf("Collects:");
 for(i=0;i<5;i++)
 {
  printf("%d ",a[i]);
 }
 //输出集合中包含k个元素的子集
 
 printf("\nHow many element do you want to choose:");
 scanf("%d",&k);
 len=k;
 printf("As follows:\n");
 Comb(a,5,0,k);  //调用Comb函数
 
 //输出集合的所有子集
 /*
 getchar();
 i=1;
 while(i<=5)
 {
  printf("include %d:\n",i);
  len=i;
  Comb(a,5,0,i);  //调用Comb函数
  putchar('\n');
  i++;
 }
 */

 printf("\nThe end!");
 getche();
}

posted @ 2008-04-14 00:00  calm  阅读(533)  评论(0编辑  收藏  举报