DS02_实现基础_陈越主编_数据结构题稿.ppt

  1. 1、本文档共25页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[例2.8] 设计函数求n! 图2.7 递归求解4!的过程 第2章 实现基础 §2.3 流程控制基础 long int Factorial( int n ) { if( n == 0 ) return 1; else return n * Factorial(n-1); } 递归出口 递归式子 Factorial(4) 4? Factorial (3) 3? Factorial (2) 2? Factorial (1) 1? Factorial (0) 1 1 2 6 24 21/25 [例2.9] 汉诺塔(Tower of Hanoi)问题 1 3 2 1 3 2 (a)初始状态 (b)中间状态 §3 流程控制基础 第2章 实现基础 【分析】可以用递归方法来求解汉诺塔问题,也就是将n个金片的移动问题转换为2个n-1个金片的移动问题。当n=1时,就不需要再递归了。 void Move(int n, int start, int goal, int temp) { if( n == 0 ) return; Move(n-1, start, temp, goal); printf(“Move disk %d from %d to %d.\n”, n, start, goal); Move(n-1, temp, goal, start); } 递归调用 22/25 §3 流程控制基础 第2章 实现基础 ① Move (3,1,3,2) Move (2,1,2,3) Move (1,1,3,2) Move (0,1,2,3) Move (0,2,3,1) Move disk 2 from 1 to 2 Move (1,3,2,1) Move (0,3,1,2) Move disk 3 from 1 to 3 Move (1,2,1,3) Move (0,1,2,3) Move disk 1 from 3 to 2 Move (0,3,1,2) Move (1,1,3,2) Move (0,1,2,3) Move (0,2,3,1) Move (0,2,3,1) Move (2,2,3,1) Move disk 1 from 2 to 1 Move disk 1 from 1 to 3 Move disk 1 from 1 to 3 ② ③ ④ ⑤ ⑥ ⑦ Move disk 2 from 2 to 3 23/25 [例2.10] 用递归方法求集合的中位数。 第2章 实现基础 §2.3 流程控制基础 ? 根据前面求解集合第K大整数问题的递归算法思路,还需要解决以下两个关键问题: (1)如何根据元素e将集合S分解为S1和S2两个集合? 可以采用临时申请空间的方法建立一个临时数组。 (2)如何设计递归函数的参数? 将临时数组作为参数传递。 #include malloc.h ElementType Median(ElementType S[ ], int N) { ElementType *p, m; /* 申请临时数组大小所需要的空间*/ p = (ElementType *) malloc( sizeof (ElementType)*N); m = FindKthLargest( S, (N+1)/2, 0, N-1, p ); free(p); /* 释放临时数组空间 */ return m; } 24/25 ElementType FindKthLargest( ElementType S[ ], int K, int left, int right, ElementType t[ ]) { /* 在S[left]..S[right]中找第K大整数,t是临时数组 */ int i, Large = left, Small = right; /* Large和Small分别指向S1和S2在临时数组中的下一个存放位置 */ ElementType e; /* 分解集合的基准e */ e = S[left]; /* 将第一个元素作为基准 */ for ( i = left; i = right; i++ ) if ( S[i] = e ) /*将比e大的元素放临时数组t左边,小的元素放右边 */ t[Large++] = S[i]; else t[Small--] = S[i]; for ( i = left; i = right; i++ ) /*将临时数组中的元素拷贝回原数组 */ S[i]=t[i];

文档评论(0)

希望之星 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档