以下为计算含n个元素的集合共有多少分划。
如有不当,或者意见或建议,欢迎大家提出!
#include <stdio.h>
int f(int,int []); /*用于递推计算*/
int A(int,int); /*用于计算组合数*/
int main()
{
int n;
printf("请输入元素个数n:");
scanf("%d",&n);
int set[100]={1,1,2};
int i;
for(i=3;i<n+1;i++){
set[i]=f(i,set);
}
printf("该集合的分划个数为:%d",set[n]);
}
int f(int i,int set[])
{
int sum=0;
int j;
for(j=0;j<i;j++){
int h=i-1;
int C=A(h,j);
sum+=C*set[j];
}
return sum;
}
int A(int h,int j)
{
int a,b,numerator=1,denominator=1;
for(a=h-j+1;a<h+1;a++){
numerator*=a;
}
for(b=1;b<j+1;b++){
denominator*=b;
}
int C=numerator/denominator;
return C;
}
该程序基于公式:
其中An为含n个元素的集合,Bn为其所含分划个数,
已知B0=1,B1=1,B2=2。
(简要证明思路:An+1比An多出来的一个元素与剩余元素进行分组,借此变为含n个元素的集合,比An-1多出来的两个元素不重合式与剩下元素进行分组,变为含n-1个元素的集合,以此类推,从而建立递推关系)