组合数学实验报告.docx
- 文档编号:8256098
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:17
- 大小:415.89KB
组合数学实验报告.docx
《组合数学实验报告.docx》由会员分享,可在线阅读,更多相关《组合数学实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
组合数学实验报告
组合数学实验报告
班级:
网络091班
姓名:
郭静
学号:
092566
实验一Fibonacci数非递归解
一、实验题目
Fibonacci数列
的定义如下:
请用递归方法和非递归方法求解该问题,各编写一个函数,要求函数接受
的值,返回
的值。
二、实验要求
1分别求
的情况。
2对比两个程序的执行时间,然后分别对两种算法进行复杂性分析。
三、实验源程序
#include
#include
usingnamespacestd;
//递归方式求解Fibonacci数列
doublemethodOneFibonacci(intn)
{
doubleresult;
if(n==1||n==2)
{
result=1;
}
else
{
result=methodOneFibonacci(n-2)+methodOneFibonacci(n-1);
}
returnresult;
}
//非递归方式求解Fibonacci数列
doublemethodTwoFibonacci(intn)
{
doubleresult;
doublef1=1;
doublef2=1;
if(n==1||n==2)
{
result=1;
}
else
{
while(n-2)
{
result=f1+f2;
f1=f2;
f2=result;
n--;
}
}
returnresult;
}
double(*fibonacci)(intn);
voiddeal(intn)
{
//计算结果
doubleresult;
//计算开始时间
clock_tstart;
//计算结束时间
clock_tfinish;
//计算花费的时间
doubleduration;
start=clock();
result=fibonacci(n);
cout<<"theresultis"< finish=clock(); duration=((double)(finish-start))/CLOCKS_PER_SEC; cout<<"spenttimeis"< } intmain(intargc,char*argv[]) { while (1) { //参数,表述计算的规模 intn; cout<<"inputthedatanis: "; cin>>n; if(n>0) { cout<<"采用非递归的方法进行求解: "< fibonacci=methodTwoFibonacci; deal(n); cout<<"采用递归的方法进行求解: "< fibonacci=methodOneFibonacci; deal(n); } else { cout<<"niswrong,pleaseinputthenagain! "< } } return0; } 四、实验结果 采用递归算法时消耗太多的时间。 五、实验总结 结果截图是递归算法与非递归算法的执行时间对比。 根据两种算法所写的程序的执行时间的的对比,非递归算法要比递归算法的效率要高很多。 而且随着n的逐渐增大,非递归算法的效率要远远超过递归算法的效率。 但是,采用递归算法编写的程序易于理解,并且易于编写。 实验二二项式系数的加法求解 一、实验题目 编写一个程序,只用加法,求出 中取 个的组合数 二、实验要求 1要求使用公式 ,采用递归方法和非递归方法进行求解 2对两种算法进行分析 三、实验源程序 #include #include usingnamespacestd; //采用递归方法求解组合数 intMethodOneCombinatorics(intn,intr) { intresult; if(r==0||n==1||n==r) { result=1; } else { result=MethodOneCombinatorics(n-1,r)+MethodOneCombinatorics(n-1,r-1); } returnresult; } //采用非递归方法求解组合数 intMethodTwoCombinatorics(intn,intr) { intresult; intC1=1; intC2=1; if(r==0||n==1||n==r) { result=1; } else { int*tempCom=newint[n]; for(inti=0;i { tempCom[i]=1; } for(inti=2;i { for(intj=1;j { C1=C2; C2=tempCom[j]; tempCom[j]=C1+C2; } } result=tempCom[r-1]+tempCom[r]; } returnresult; } int(*Combinatorics)(intn,intr); voiddeal(intn,intr) { intresult; clock_tstart; clock_tfinish; doubleduration; start=clock(); result=Combinatorics(n,r); cout<<"theC("< finish=clock(); duration=((double)(finish-start))/CLOCKS_PER_SEC; cout<<"spenttimeis"< } intmain(intargc,char*argv[]) { intn; intr; while (1) { cout<<"inputthe(n,r)is: "; cin>>n>>r; if(r>n) { cout<<"thenandriswrong,pleaseretry! "< } else { cout<<"采用非递归方式求解组合数: "< Combinatorics=MethodTwoCombinatorics; deal(n,r); cout<<"采用递归方式求解组合数: "< Combinatorics=MethodOneCombinatorics; deal(n,r); } cout<<"-------------------------------------------"< } return0; } 四、实验结果 五、实验总结 当n一定时,随着r的增大,递归算法的效率越来越低,但是非递归算法的效率所受的影响比较小;当r一定时,随着n的增大,递归算法的效率越来越低,但是非递归算法的效率所受的影响比较小。 所以随着n的增大,非递归算法的效率要远高于递归算法。 随着r的增大(r<=n/2),非递归算法的效率要远高于递归算法。 实验三所有K各元素的子集 一、实验题目 编写一个程序,用字典顺序列出n个元素的所有排列(Permutation) 二、实验要求 编写字典顺序求n个元素的所有排列。 三、实验源程序 #include usingnamespacestd; voidmain() { intn,N; cout<<"请输入元素个数: "; cin>>N; inti=0; int*a=newint[N]; for(i=0;i a[i]=i+1; intj=0; n=1; intfac_N=1; while(n++ //cout< cout< "< for(i=0;i cout< cout< for(i=1;i { intmax_j=0,max_k=0; for(j=0;j { if(a[j] max_j=j+1; } for(j=0;j { if((max_j>0)&&(a[max_j-1] max_k=j; } inttemp; if(max_j>0) { temp=a[max_j-1]; a[max_j-1]=a[max_k]; a[max_k]=temp; } for(j=max_j;j<=max_j+(N-1-max_j)/2;j++) { temp=a[j]; a[j]=a[N-1+max_j-j]; a[N-1+max_j-j]=temp; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 组合 数学 实验 报告