Pascal递归剖析.ppt

  1. 1、本文档共42页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Pascal递归剖析

第七讲 递归 一、递归的概念 若在一个函数、过程或者数据结构定义的内部,直接(或间接)出现定义本身的应用,则称它们是递归的,或者是递归定义的。 递归是一种强有力的数学工具,它可使问题的描述和求解变得简洁和清晰。 n!=n*(n-1)! F(n)=F(n-1)+F(n-2) 一、递归的概念 对于一个递归定义而已,除了要定义递归的方式(即如何递归)外,还必须定义递归的终止条件(即如何停止递归),否则递归将永无止境的进行下去。 程序一般调用 程序递归调用 Pascal语言中的向前引用 二、递归算法用于解决的问题 一般来说,能够用递归解决的问题应该满足以下三个条件: 需要解决的问题可以化为一个或多个子问题来求解,而这些子问题的求解方法与原来的问题完全相同,只是在数量规模上不同; 递归调用的次数必须是有限的; 必须有结束递归的条件(边界条件)来终止递归。 二、递归算法用于解决的问题 可用递归解决的具体问题: 数据的定义形式是按递归定义的。如阶乘。 问题的解法按递归算法实现。如回溯算法。 数据结构的形式是按递归定义的。如树的遍历。 三、递归算法的执行过程 三、递归算法的执行过程 在递归调用之前,系统需完成三件事: 为被调用过程的局部变量分配存储区; 将所有的实在参数、返回地址等信息传递给被调用过程保存; 将控制转移到被调过程的入口。 从被调用过程返回调用过程之前,系统也应完成三件工作: 保存被调过程的计算结果; 释放被调过程的数据区; 依照被调过程保存的返回地址将控制转移到调用过程。 三、递归算法的执行过程 在计算机中,是通过使用系统栈来完成上述操作的。系统栈的元素会包括值参、局部变量和返回地址。在每次执行递归调用之前,系统自动把本程序所使用到的值参和局部变量的当前值以及调用后的返回地址压栈(保存现场);当每次递归调用结束之后,系统又自动把栈顶元素出栈,覆盖掉相应的值参和局部变量,使他们恢复到递归调用之前的值(恢复现场),然后程序无条件的转向由返回地址所指定的位置继续执行。 三、递归算法的执行过程 四、应用举例—汉诺塔问题 如图所示,我们有三根柱子(A、B、C)和若干大小各异的圆盘,一开始的时候,所有圆盘都在A柱上,且按照从小到大的顺序排列整齐(小的在上,大的在下),现在请你把所有的圆盘从A柱搬到C柱上去。在搬动的时候,一次只能将某柱最顶端的一个圆盘移动到另一柱的最顶端,且在移动的过程中,永远不允许出现大圆盘在小圆盘之上的情况。 汉诺塔问题 输入:3 输出: A-C A-B C-B A-C B-A B-C A-C 汉诺塔问题 只有一个盘子的移动:A?C 两个盘子的移动:A?B,A?C,B?C n个盘子的移动(n2): 将上面的n-1个盘子看成一个整体,则此问题被转换为两个盘子的移动 而n-1个盘子的移动规则与此相同 汉诺塔问题的递归描述 当只移动一个盘子的时候,直接从起始柱移动到目标柱,否则,执行如下操作: 将前n-1盘子以相同的方法从起始柱移动到临时柱; 将第n个盘子直接移动到目标柱; 将前n-1个盘子以相同的方法从临时柱移动到目标柱; 汉诺塔问题递归代码 四、应用举例—斐波那契数列 有一种兔子,出生后一个月就可以长大,然后再过一个月一对长大的兔子就可以生育一对小兔子且以后每个月都能生育一对。 现在,我们有一对刚出生的这种兔子,那么,n个月过后,我们会有多少对兔子呢?假设所有的兔子都不会死亡。 输入:5 输出:5 兔子出生演示 斐波那契数列 从上面的分析可以看到,第n个月后兔子的数目有两部分构成:1、上月的所有兔子;2、上月的所有老兔子所生的小兔子。 因此,若我们记第n个月的兔子总数为F(n)、老兔子数为G(n)的话,那么F(n)=F(n-1)+G(n-1)。 那么G(n)怎么得到呢?通过分析上图,我们可以发现,第n个月的老兔子数等于第n-1个月的兔子总数,因此上式中的G(n-1)=F(n-2)。 斐波那契数列 因此,我们可以得到递归公式: F(n)=F(n-1)+F(n-2) 而递归的终止条件则是: n=1或n=2时,F(n)=1 斐波那契数列 四、应用举例—n皇后问题 在一个n×n的棋盘上放置n个国际象棋中的皇后,要求所有的皇后之间都不形成攻击。请你给出所有可能的排布方案数。 输入:4 输出:2 n皇后问题 对于n皇后问题而言,我们很难找出很合适的方法来快速的得到解,因此,我们只能采取最基本的枚举法来求解。 但我们知道,在n×n的棋盘上放置n个棋子的所有放置方案有 种,而这个数字是否庞大,直接枚举肯定会超时。 n皇后问题 但是考虑到皇后攻击的特性,所有的皇后不能同行、同列,因此,我们可以人为的限定所有的皇后不同行、同列,这样的话,所有的可能性就只有n!种了。 我们只要枚举出所有这n!种排布,找出其中满足任意两皇后都不共对角

文档评论(0)

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

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

1亿VIP精品文档

相关文档