计算机语言与程序设计 (6)

计算机语言与程序设计 (6)

ID:44996375

大小:176.50 KB

页数:41页

时间:2019-11-07

计算机语言与程序设计 (6)_第1页
计算机语言与程序设计 (6)_第2页
计算机语言与程序设计 (6)_第3页
计算机语言与程序设计 (6)_第4页
计算机语言与程序设计 (6)_第5页
资源描述:

《计算机语言与程序设计 (6)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、计算机程序设计基础第六讲递归1递归算法在可计算性理论中占有重要地位,它是算法设计的有力工具,对于拓展编程思路非常有用。就递归算法而言并不涉及高深数学知识,只不过初学者要建立起递归概念不十分容易。我们先从一个最简单的例子导入。递归及其实现用递归算法求n!定义:函数fact(n)=n!fact(n-1)=(n-1)!则有fact(n)=nfact(n-1)已知fact(1)=12为了表述得直观清晰,我们定义两个结点:或结点与与结点。图示的直观性与思维助力。1、或结点A为“或结点”,A依不同条件会有两种不同的取值B或C。结点用表示。3如果有多于2种取值,可用下图:条件为Z1,Z2,…,Zn,取

2、值为B或C,…或G42、与结点与结点要涂黑,相关联的B与C之间要用弧线连起来。A为与结点,A的最终取值为C结点的值,但为了求得C的值,得先求出B结点的值,C是B的函数。5仍以求n!为例画出如下与或图A为或结点;B为直接可解结点,值为1;C为与结点,当n>1时,A的取值即C的值,而C的值即E的值,为了求得E的值,需要先求出D的值。D值fact(n-1)乘以n即为E的值。6与结点可能有多个相关联的点,这时可描述为下图A结点的值最终为D的值,但为了求D需先求B和C。从图上看先求左边的点才能求最右边的点的值,我们约定最右边D点的值就是A结点的值。7下面我们以3!为例来画与或结点图,目的是体会递归

3、的含义。C=1D=2*C=2B=D=2E=3*B=3*2=6A=E=68下面画出了调用和返回的递归示意图9从图可以想象:欲求fact(3),先要求fact(2);要求fact(2)先求fact(1)。就象剥一颗圆白菜,从外向里,一层层剥下来,到了菜心,遇到1的阶乘,其值为1,到达了递归的边界。然后再用fact(n)=n*fact(n-1)这个普遍公式,从里向外倒推回去得到fact(n)的值。为了把这个问题说得再透彻一点。我们画了如下的流程图:1011为了形象地描述递归过程,将上图改画成下图12在这个图中“内层”与“外层”有着相同的结构。它们之间“你中有我,我中有你”,呈现相互依存的关系。

4、为了进一步讲清递归的概念,将递归与递推做一比较。仍以求阶乘为例。递推是从已知的初始条件出发,逐次去求所需要的阶乘值。如求3!初始条件fact(1)=1fact(2)=2*fact(1)=2fact(3)=3*fact(2)=613这相当于从菜心“推到”外层。而递归算法的出发点不放在初始条件上,而放在求解的目标上,从所求的未知项出发逐次调用本身的求解过程,直到递归的边界(即初始条件)。就本例而言,读者会认为递归算法可能是多余的,费力而不讨好。但许多实际问题不可能或不容易找到显而易见的递推关系,这时递归算法就表现出了明显的优越性。下面我们将会看到,递归算法比较符合人的思维方式,逻辑性强,可将

5、问题描述得简单扼要,具有良好的可读性,易于理解,许多看来相当复杂,或难以下手的问题,如果能够使用递归算法就会使问题变得易于处理。下面举一个尽人皆知的例子哈诺(Hanoi)塔问题。14故事:相传在古代印度的Bramah庙中,有位僧子整天把三根柱子上的金盘倒来倒去,原来他是想把64个一个比一个小的金盘从一根柱子上移到另一根柱子上去。移动过程中恪守下述规则:每次只允许移动一只盘,且大盘不得落在小盘上面。有人会觉得这很简单,真的动手移盘就会发现,如以每秒移动一只盘子的话,按照上述规则将64只盘子从一个柱子移至另一个柱子上,所需时间约为5800亿年。15怎样编写这种程序?从思路上还是先从最简单的情

6、况分析起,搬一搬看,慢慢理出思路。1、在A柱上只有一只盘子,假定盘号为1,这时只需将该盘从A搬至C,一次完成,记为move1fromAtoC162、在A柱上有二只盘子,1为小盘,2为大盘。第(1)步将1号盘从A移至B,这是为了让2号盘能移动;第(2)步将2号盘从A移至C;第(3)步再将1号盘从B移至C;这三步记为:move1fromAtoB;move2fromAtoC;move3formBtoC;173、在A柱上有3只盘子,从小到大分别为1号,2号,3号第(1)步将1号盘和2号盘视为一个整体;先将二者作为整体从A移至B,给3号盘创造能够一次移至C的机会。这一步记为move(2,A,C,B

7、)意思是将上面的2只盘子作为整体从A借助C移至B。第(2)步将3号盘从A移至C,一次到位。记为move3fromAtoC第(3)步处于B上的作为一个整体的2只盘子,再移至C。这一步记为move(2,B,A,C)意思是将2只盘子作为整体从B借助A移至C。所谓借助是什么意思,等这件事做完了不言自明。18194、从题目的约束条件看,大盘上可以随便摞小盘,相反则不允许。在将1号和2号盘当整体从A移至B的过程中move(2,A,C,B)实际上

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。