程序的设计实习(II):算法的设计 第15讲 递归.pptxVIP

程序的设计实习(II):算法的设计 第15讲 递归.pptx

  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文档。上传文档
查看更多
程序的设计实习(II):算法的设计 第15讲 递归.pptx

程序设计实习(II): 算法设计第十五讲 递 归主要内容递归基本思想关键问题小游戏 (POJ2802)棋盘分割 (POJ1191) 开关网络求阶乘的递归程序给定n,求阶乘n!#include iostream.hint Factorial(int n){ if (n == 0) return 1; else return n * Factorial(n - 1);}阶乘的栈输入参数为0 Factorial(0) 返回值为1输入参数为11*Factorial(0)返回值为1输入参数为22*Factorial(1)返回值为2输入参数为33*Factorial(2)返回值为6输入参数为44*Factorial(3)返回值为24 主程序递归的基本思想什么是递归递归是指某个函数直接或间接的调用自身。问题的求解过程就是划分成许多相同性质的子问题的求解,而小问题的求解过程可以很容易的求出,这些子问题的解就构成了原问题的解。总体思想待求解问题的解?输入变量x的函数f(x)通过寻找函数g( ),使得f(x) = g(f(x-1))且已知f(0)的值,就可以通过f(0)和g( )求出f(x)的值推广扩展到多个输入变量x,y,z等,x-1也可以推广到 x - x1,只要递归朝着“出口”的方向即可递归解决问题的关键1) 找出递推公式2) 找到递归终止条件注意事项:由于函数的局部变量是存在栈上的,如果有体积大的局部变量,比如数组,而递归层次又可能很深的情况下,也许会导致栈溢出,因此可以考虑使用全局数组或动态分配数组POJ2802 小游戏问题描述一天早上,你起床的时候想“我编程序这么牛,为什么不能靠这个赚点小钱呢?”因此你决定编写一个小游戏。游戏在一个分割成w * h个正方格子的矩形板上进行。如图所示,每个正方格子上可以有一张游戏卡片,当然也可以没有。当下面的情况满足时,我们认为两个游戏卡片之间有一条路径相连:路径只包含水平或者竖直的直线段。路径不能穿过别的游戏卡片。但是允许路径临时的离开矩形板。下面是一个例子:这里在 (1, 3)和 (4, 4)处的游戏卡片是可以相连的。而在 (2, 3) 和 (3, 4) 处的游戏卡是不相连的,因为连接他们的每条路径都必须要穿过别的游戏卡片。你现在要在小游戏里面判断是否存在一条满足题意的路径能连接给定的两个游戏卡片输入输入包括多组数据。一个矩形板对应一组数据。每组数据包括的第一行包括两个整数w和h (1 = w, h = 75),分别表示矩形板的宽度和长度。下面的h行,每行包括w个字符,表示矩形板上的游戏卡片分布情况。使用‘X’表示这个地方有一个游戏卡片;使用空格表示这个地方没有游戏卡片。之后的若干行上每行上包括4个整数x1, y1, x2, y2 (1 = x1, x2 = w, 1 = y1, y2 = h)。给出两个卡片在矩形板上的位置 (注意:矩形板左上角的坐标是(1, 1))。输入保证这两个游戏卡片所处的位置是不相同的。如果一行上有4个0,表示这组测试数据的结束。如果一行上给出w = h = 0,那么表示所有的输入结束了。输出对每一个矩形板,输出一行“Board #n:”,这里n是输入数据的编号。然后对每一组需要测试的游戏卡片输出一行。这一行的开头是“Pair m: ”,这里m是测试卡片的编号(对每个矩形板,编号都从1开始)。接下来,如果可以相连,找到连接这两个卡片的所有路径中包括线段数最少的路径,输出“k segments.”,这里k是找到的最优路径中包括的线段的数目;如果不能相连,输出“impossible.”。每组数据之后输出一个空行。样例输入 5 4 XXXXX X X XXX X XXX 2 3 5 3 1 3 4 4 2 3 3 4 0 0 0 0 0 0 样例输出 Board #1: Pair 1: 4 segments. Pair 2: 3 segments. Pair 3: impossible. 问题分析 (1)一个迷宫求解问题,自相似性表现在每走一步的探测方式相同,可以用递归算法求解。通过穷举方式找到从起点到终点的路径,朝一个方向走下去,如果走不通,则换个方向走;四个方向都走不通,则回到上一步的地方,换个方向走;依次走下去,直到走到终点。计算路径数目:普通迷宫问题的路径数目是经过的格子数目,而该问题路径只包含水平或者竖直的直线段,所以需要记录每一步走的方向,如果上一步走的方向和这一步走的方向相同,递归搜索时路径数不变,否则路径数加1。问题分析 (2)(1,3)(2,3)(5,3)(3,4)(4,4)路径只包含水平或者竖直的直线段。路径不能穿过别的游戏

文档评论(0)

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

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

1亿VIP精品文档

相关文档