第三章 递归详解.ppt

  1. 1、本文档共59页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
举例说明: F(a,b) {a=a+b; } Main() { a=2; b=3; f(a,b); A? } * 棋子移动问题 移动规则 每次必须同时移动相邻两个棋子 颜色不限,移动方向不限 每次移动必须跳过若干棋子 不能调换这两个棋子的位置 * n=4 _ step1 000_ _11101 (4,5)?(9,10) step2 0001011_ _1 (8,9)?(4,5) step3 0_ _1011001 (2,3)?(8,9) step4 010101_ _01 (7,8)?(2,3) step5 _ (1,2)?(7,8) 寻找递归出口 * n?5 0000011111_ _ step1 0000_ _111101 (5,6)?(11,12) step2 _01 (9,10)?(5,6) n?6 000000111111_ _ step1 00000_ _1111101 (6,7)?(13,14) step2 0000011111_ _01 (11,12)?(6,7) chess(n) 递归出口:n?4; 递归过程:n?4时; move (n,n?1)?(2n?1,2n?2); move (2n?1,2n)?(n,n?1); call chess(n?1); * 棋子的移动问题 Procedure Chess(n) if n=4 then move (4,5) ?(9,10) move (8,9) ?(4,5) move (2,3) ?(8,9) move (7,8) ?(2,3) move (1,2) ?(7,8) else move (n, n+1) ?(2n+1, 2n+2) move (2n?1, 2n) ?(n, n+1) call Chess(n-1) endif End Chess 递归出口 递归调用 A(9)←A(4) A(10)←A(5) * 例3.6 求n个元素的全排列 设A={a1,a2,…,an}是要进行排列的n个元素的集合, n?1 输出a1 n?2 输出a1a2 a2a1 n?3 输出a3a1a2 a3a2a1 a1a2a3 a1a3a2 a2a1a3 a2a3a1 分析n=3,排列按如下步骤进行: a3之后跟a1,a2的所有全排列; 在上述全排列里,a3和a1位置互换; 在上述全排列里,a3和a2位置互换。 * 求n个元素的全排列 range(A) = a1range(A1), a2range(A2),…, anrange(An) 集合A用数组实现 range(A,1,n): 递归出口:range(A, n, n) 递归调用:使得集合所有元素都可以作为前缀出现 A-a1 A-a2 A-an * 求n个元素的全排列 procedure range(A, k, n) if k?n then print(A) else for i ?k to n do A(k) ? A(i) call range(A,k?1,n) A(k) ? A(i) repeat endif end range 递归出口,打印整个数组A。 A(i)与A(k)值互换 缺省时,认为形参是in型,其值变化时不回传。 call range(A,1,n) * range(A,1,3) If 1=3 then print(A) els

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档