- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第五章 递归
申燕萍
2014年 2月 7日
本章要点
递归的基本概念和实现原理
递归的思想描述问题和书写算法的方法。
阶乘等问题的递归解法。
用非递归方式来实现递归问题的非递归解法
5.1 “汉诺塔”案例导入
“汉诺塔”引例:汉诺塔问题,源于印度的一个很古老的传说。传说中开天辟地的神勃拉玛在一个庙里留下了三根金刚石的柱子,第一根上面套着64个由上至下由小至大排列的金盘。庙里的众僧不倦地把它们一个个地从第一根柱子搬到第三根柱子上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且搬运过程中需遵循大的不能放在小的上面的原则。预言当所有的盘子都从第一根柱子移到第三根柱子上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
考虑把64个盘子,由一个塔柱上移到另一根塔柱上,并始终保持上小下大的顺序的问题。如果我们把三个柱子标上ABC,要将所有的盘子由A搬至C。显然,在只有一个盘子时,只要直接搬至C。当有两个盘子,需将B用作辅助柱。如果盘数超过2个,将从第二个开始的盘子遮起来,当作一个整体。这样每次处理两个盘子,也就是执行A-B,A-C,B-C这三个步骤。假设有n个盘子,移动次数是f(n)。此后不难证明f(n)=2n-1。那么n=64时,移动盘子的次数f(64)=2^64-1=18446744073709551615,计算结果非常恐怖。假如每秒钟搬一个,一年大约,这样完成任务共需大约5850亿年左右,比地球寿命还要长。
思考:如何用程序计算出任意n个盘子的汉诺塔问题
5.2.1 递归的基本概念
当求解一个问题时,如果可以通过求解与它具有相同解法的子问题而得到的话,就是递归。表现在程序设计中程序直接或间接调用自身的编程技巧称为递归(recursion)。
通过“递归”通常可以把一个大型复杂的问题层层转化为一个与原题相似的、规模较小的问题来求解。递归策略只需少量的程序就可以描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
5.2 递归
以下三种情况常常用到递归。
1、问题的定义是递归的
简单地说,如果在一个函数定义过程中又引用了它本身(作为定义项之一),那么这个函数是递归定义的。有很多数学函数有这种情况。
【例5-1】阶乘函数可递归定义如下:
1 n=0
n!= 1 n=1
n*(n-1)! n1
参考程序(详见教材)
【例5-2】计算斐波那契数列的函数Fib(n)递归定义如下
参考程序(详见教材)
2、数据结构是递归的
指数据结构中又包含了与本身相同的数据结构。
【例5-3】单链表数据类型定义如下:
#define datatype char;
typedef struct node
{
datatype data;
struct node *next;
}LINKLIST;
图5-1 单链表的数据结构示意图
3、解决问题的方法是递归的
在解决问题的过程发现可以用相同方法反复调用去处理问题。有很多问题我们可以用递归的思想去解决,现在,我们来看一个基本的例子。
【例5-4】将数组的元素逆置:
算法分析:将数组的元素逆置可以看成是将第一个和第n个交换,然后将剩余的元素继续进行数组的元素逆置。
void inverse(int a[],int n)
{
if(n2) return;
swap(a[0],a[n-1]);/*swap(a,b)为交换a,b的值*/
inverse(a+1,n-2); /*递归调用 */
}
5.2.2 递归实现原理
一般来说,递归定义不能是“循环定义”。任何递归定义必须同时满足两个条件:
(1)能够转换为和原问题类似但具有更小规模的问题。
(2)在“最小规模”时能有明确的结果。也就是必须有一个明确的递归结束条件,通常称之为递归出口。
也就是说,递归过程必须解决两个问题:一是递归计算的公式,二是递归结束的条件。
对求阶乘的递归函数来说,这两个条件可以写成:
递归计算公式:fac(n)=n*fac(n-1)
递归结束条件:fac(0)=1
在程序设计中这两个条件可以采用下列的双分支语句来实现:
if(递归结束条件) return(递归结束条件中的返回值);
else return( 递归计算公式);
上述语句中else分支后面的return部分还可以称为递归前进段,if分支后面的return部分称为递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
递归
您可能关注的文档
- 市场营销调研教学资料 2015 chapter 13 描述统计与样本量确定.ppt
- 市场营销调研教学资料 2015 chapter 15.ppt
- 市场营销调研教学资料 2015chapter14假设检验数据分析.ppt
- 市场营销调研教学资料 SPSS入门第二课.doc
- 市场营销调研教学资料 SPSS入门第六课T检验与方差分析.docx
- 市场营销调研教学资料 SPSS入门第五课卡方分析.docx
- 市场营销调研教学资料 SPSS入门第一课:制作频次分布图.doc
- 市场营销调研教学资料 从Z检验到T检验到F检验.doc
- 市场营销调研教学资料 第十三章描述统计学习要点及作业 2.doc
- 市场营销调研教学资料 第十四章假设检验.doc
文档评论(0)