ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:415.89KB ,
资源ID:8256098      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8256098.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(组合数学实验报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

组合数学实验报告.docx

1、组合数学实验报告组合数学实验报告班级:网络091班姓名:郭静学号:092566实验一 Fibonacci数非递归解一、实验题目 Fibonacci数列的定义如下: 请用递归方法和非递归方法求解该问题,各编写一个函数,要求函数接受的值,返回的值。二、实验要求 1 分别求的情况。2 对比两个程序的执行时间,然后分别对两种算法进行复杂性分析。三、实验源程序#include #include using namespace std;/ 递归方式求解Fibonacci数列double methodOneFibonacci(int n) double result; if(n=1 | n=2) resul

2、t=1; else result=methodOneFibonacci(n-2)+methodOneFibonacci(n-1); return result;/ 非递归方式求解Fibonacci数列double methodTwoFibonacci(int n) double result; double f1=1; double f2=1; if(n=1 | n=2) result=1; else while(n-2) result=f1+f2; f1=f2; f2=result; n-; return result;double (*fibonacci)(int n);void deal

3、(int n) / 计算结果 double result; / 计算开始时间 clock_t start; / 计算结束时间 clock_t finish; / 计算花费的时间 double duration; start=clock(); result=fibonacci(n); coutthe result is resultendl; finish=clock(); duration=(double)(finish-start)/CLOCKS_PER_SEC; coutspent time is durationsendl;int main(int argc,char* argv) wh

4、ile(1) / 参数,表述计算的规模 int n; coutn; if(n0) cout采用非递归的方法进行求解:endl; fibonacci=methodTwoFibonacci; deal(n); cout采用递归的方法进行求解:endl; fibonacci=methodOneFibonacci; deal(n); else coutn is wrong,please input the n again!endl; return 0;四、实验结果 采用递归算法时消耗太多的时间。五、实验总结结果截图是递归算法与非递归算法的执行时间对比。 根据两种算法所写的程序的执行时间的的对比,非递归

5、算法要比递归算法的效率要高很多。而且随着n的逐渐增大,非递归算法的效率要远远超过递归算法的效率。但是,采用递归算法编写的程序易于理解,并且易于编写。实验二 二项式系数的加法求解一、实验题目编写一个程序,只用加法,求出中取个的组合数二、实验要求 1 要求使用公式,采用递归方法和非递归方法进行求解2 对两种算法进行分析三、实验源程序#include #include using namespace std;/ 采用递归方法求解组合数int MethodOneCombinatorics(int n,int r) int result; if(r=0 | n=1 | n=r) result=1; el

6、se result=MethodOneCombinatorics(n-1,r)+MethodOneCombinatorics(n-1,r-1); return result;/ 采用非递归方法求解组合数int MethodTwoCombinatorics(int n,int r) int result; int C1=1; int C2=1; if(r=0 | n=1 | n=r) result=1; else int* tempCom=new intn; for(int i=0;in;i+) tempComi=1; for(int i=2;in;i+) for(int j=1;ji;j+)

7、C1=C2; C2=tempComj; tempComj=C1+C2; result=tempComr-1+tempComr; return result;int (*Combinatorics)(int n,int r);void deal(int n,int r) int result; clock_t start; clock_t finish; double duration; start=clock(); result=Combinatorics(n,r); coutthe C(n,r) is resultendl; finish=clock(); duration=(double)

8、(finish-start)/CLOCKS_PER_SEC; coutspent time is durationsendl;int main(int argc,char* argv) int n; int r; while(1) coutnr; if(rn) coutthe n and r is wrong, please retry!endl; else cout采用非递归方式求解组合数:endl; Combinatorics=MethodTwoCombinatorics; deal(n,r); cout采用递归方式求解组合数:endl; Combinatorics=MethodOneCo

9、mbinatorics; deal(n,r); cout-endl; return 0;四、实验结果五、实验总结当n一定时,随着r的增大,递归算法的效率越来越低,但是非递归算法的效率所受的影响比较小;当r一定时,随着n的增大,递归算法的效率越来越低,但是非递归算法的效率所受的影响比较小。所以随着n的增大,非递归算法的效率要远高于递归算法。随着r的增大(r=n/2),非递归算法的效率要远高于递归算法。实验三 所有K各元素的子集一、实验题目 编写一个程序,用字典顺序列出n个元素的所有排列(Permutation)二、实验要求编写字典顺序求n个元素的所有排列。三、实验源程序#includeusing

10、 namespace std;void main() int n,N; coutN; int i=0; int *a=new intN; for(i=0;iN;i+) ai=i+1; int j=0; n=1; int fac_N=1; while(n+N) fac_N=fac_N*n; /coutfac_N; coutendl所得结果依次为:endl; for(i=0;iN;i+)/output the original 1234.n coutai; coutendl; for(i=1;ifac_N;i+) int max_j=0,max_k=0; for(j=0;jN-1;j+) if(a

11、jaj+1) max_j=j+1; for(j=0;j0)&(amax_j-10) temp=amax_j-1; amax_j-1=amax_k; amax_k=temp; for(j=max_j;j=max_j+(N-1-max_j)/2;j+) temp=aj; aj=aN-1+max_j-j; aN-1+max_j-j=temp; for(int ii=0;iiN;ii+) coutaii; coutendl; coutendl; system(PAUSE);四、实验结果 五、实验总结字典顺序法是生成排列数的一种比较简单的算法,生成的效率也比较高。字典顺序法生成的排列数按照由大到小的顺序

12、排列,呈现一定的规律性。通过字典顺序法的学习,掌握了生成排列数的一种方法。实验四 整数的所有不同分割数目一、实验题目编写一个递归程序,输入一个正整数,输出它不同分割方式的数目二、实验要求用P(n,m)表示在n的分割中极大值最多为m的分割数,亦即分割具有n=m+,n=m+ m+,n= m+m+ m+,这一类形式。于是n与m的关系不外乎一下几种情况:(1)m为1(2)n为1(3)n=m(4)nm显然,前两种情况是递归结束的条件,后三种情况请写出各自的递归公式,并编写程序实现之。三、实验源程序#include using namespace std;int comminuteInteger(int

13、n,int m) if(n=1 | m=1) return 1; if(nm) return comminuteInteger(n,n); if(n=m) return 1+comminuteInteger(n,m-1); return comminuteInteger(n,m-1)+comminuteInteger(n-m,m);int main(int argc,char* argv) int n; int result; while(1) coutn; result=comminuteInteger(n,n); coutthe integer ns total number is: re

14、sultendlendl; return 0;四、实验结果五、实验总结递推公式如下: 实验五 产生所有排列旋转法一、实验题目 编写一个程序,用旋转顺序(rotation order)法,列出n个元素的所有排列。二、实验要求编写旋转顺序求n个元素的所有排列。三、实验源程序#include#include#include#define M 4/链表的最大长度/long count = 0;void Solve(int n, int a);int main(void) int i; int SourceM=0; /用来存储输入的数据,数据可重复 printf(请输入%d个数字:, M); for(i

15、=0; iM; i+) scanf(%d, &Sourcei); printf(n你输入的数据为:n); Solve(M, Source); /数据处理部分 / printf(ncount=%d, count); system(pause); return 0;void Solve(int k, int a) if (k = 1) / count+; for (int i=0; iM; i+) printf(%d, ai); printf(n); else for (int i=M-k; iM; i+) int t = aM-k; aM-k = ai; ai = t; Solve(k-1, a); t = aM-k; aM-k = ai; ai = t; 四、实验结果

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1