[工学]算法.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[工学]算法

第2章 递归与分治策略 学习要点: 理解递归的概念。 掌握设计有效算法的分治策略。 通过下面的范例学习分治策略设计技巧。 (1)二分搜索技术; (2)大整数乘法; (3)Strassen矩阵乘法; (4)棋盘覆盖; (5)合并排序和快速排序; 重点:分治算法的思想 难点:递归算法的执行过程 2.1 递归的概念 直接或间接地调用自身的算法称为递归算法。 用函数自身给出定义的函数称为递归函数。 2.1 递归的概念 int factorial(int n) { ?? if (n==0) ?????? return (1); ?? else ?????? return (n*factorial(n-1)); } 第n个Fibonacci数可递归地计算如下: int fibonacci(int n) { if (n = 1) return 1; return fibonacci(n-1)+fibonacci(n-2); } 非递归表达式: A(n,m)的自变量m的每一个值都定义了一个单变量函数: m=0时,A(n,0)=n+2 m=1时,A(n,1)=A(A(n-1,1),0)= A(n-1,1)+2=A(1,1)+(n-1)*2, A(1,1)=A(A(0,1),0)=A(1,0)=2 故A(n,1)=2*n m=2时,A(n,2)=A(A(n-1,2),1)=2A(n-1,2)=2n-1*A(1,2) A(1,2)=A(A(0,2),1)=A(1,1)=2 故A(n,2)=2n 。 m=3时,类似的可以推出 m=4时,A(n,4)的增长速度非常快,以至于没有适当的数学式子来表示这一函数。 2.1 递归的概念 R的全排列可归纳定义如下: 当n=1时,perm(R)=(r),其中r是集合R中唯一的元素; 当n1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…,(rn)perm(Rn)构成。 2.1 递归的概念 X={a,b,c} Perm(X)=(a)Perm(b,c),(b)Perm(a,c),(c)Perm(a,b) template class Type void Perm(Type list[],int k,int m) { if (k==m) { for(int i=0;i=m;i++) coutlist[i]; coutendl; } else { for(int i=k;i=m;i++) { Swap(list[k],list[i]); //使list[k]始终为提取出来的ri Perm(list,k+1,m); Swap(list[k],list[i]); }}} 2.1 递归的概念 例如求正整数6的不同的划分: 6; 5+1; 4+2,4+1+1; 3+3,3+2+1,3+1+1+1; 2+2+2,2+2+1+1,2+1+1+1+1; 1+1+1+1+1+1。 在本例中,如果设p(n)为正整数n的划分数,则很难找到递归关系,因此考虑增加一个自变量:将最大加数n1(即第一个加数)不大于m(即n1 ≤ m)的划分个数记作q(n,m)。可以建立q(n,m)的如下递归关系: 1) q(n,1)=1,n≥1; 当最大数n1不大于1时,任何正整数n只有一种划分形式:n=1+1+...+1(共n个)。 2) q(n,m)=q(n,n),m≥n; 最大加数n1实际上不能大于n。因此,q(1,m)=1。 3) q(n,n)=1+q(n,n-1); 正整数n的划分由n1=n的划分和n1≤n-1的划分组成。 4) q(n,m)=q(n,m-1)+q(n-m,m),nm1; 正整数n的最大加数n1不大于m的划分由n1=m的划分和n1≤m-1 的划分组成。 int q(int n, int m) { if ((n1)||(m1)) return (0); if ((n==1)||(m==1)) return (1); if (nm) return(q(n,n); if (n==m) return(q(n,n-1)+1); return(q(n,m-1)+q(n-m,m); } public static void hanoi(int n, int a, int b, int c) {  if (n 0)  {   hanoi(n-1, a,

文档评论(0)

jiupshaieuk12 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6212135231000003

1亿VIP精品文档

相关文档