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