第06讲栈与递归.pptVIP

  • 1
  • 0
  • 约4.23千字
  • 约 21页
  • 2019-02-28 发布于北京
  • 举报
*/44 Essential of Lecture Six : 一、递归 二、汉诺塔问题 三、递归与非递归的转化 难点 */44 一、递归 递归是程序设计中最有力的方法之一。 优点:采用递归编出的程序简洁、清晰,程序结构符合结构化程序设计,可读性好。 问题:编译程序是如何处理这类带有递归调用功能的程序的?如果使用了无递归功能的程序设计语言,应该如何设计和实现这类程序呢? */44 一、递归 递归: 在定义自身的同时又出现了对自身的调用。 直接递归函数:如果一个函数在其定义体内直接调用自己,则称直接递归函数。 间接递归函数:如果一个函数经过一系列的中间调用语句,通过其它函数间接调用自己,则称间接递归函数。 */44 数学中常常利用递归手段来定义一些概念,如求阶乘的运算。n的阶乘定义为: n * ( n – 1 ) ! n0 n! = 1 n=0 例如: 显然,该递归的出口是 0! =1。 */44 求阶乘的算法如下: long fac (int n) { long p; if (n==0|| n==1) p=1; else p=n*fac(n-1) ; return p; } void main() { long x=fac(5); coutx; } */44 求阶乘的算法如下: long fac (int n) { long p; if (n==0 || n==1) p=1; else p=n*fac(n-1) ; return p; } 递归函数包含: 1、递归调用语句,如 fac (n-1); 2、基值判断,如n==0 || n==1即为基值,保证了递归可以终止,满足基值条件后的计算 p=1, 一般称为最终计算; 3、调用之后的返回处理。如 p= n * fac (n-1) ,是返回之后要进行的操作。 */44 fac(5) main() n=5 p=5*fac(4) 第一层fac n=4 p=4*fac(3) 第二层fac n=3 p=3*fac(2) 第三层fac n=2 p=2*fac(1) 第四层fac n=1 p=1 第五层fac fac(2)=2 fac(1)=1 fac(3)=6 fac(4)=24 fac(5)=120 输出 假设调用该递归函数的主函数为第0层,则从主函数调用递归函数为进入第1层;从第 i层递归调用本身为进入“下一层”,即第 i+1 层。反之,退出第 i 层递归应返回至“上一层”,即第 i-1 层。 递归层次: */44 为了保证递归函数正确执行,系统需设立一个“递归工作栈”作为整个递归函数运行期间使用的数据存储区。每一层递归所需信息构成一个“工作记录”,其中包括所有的实参、所有的局部变量以及上一层的返回地址。 每进入一层递归,就产生一个新的工作记录压入栈顶。每退出一层递归就从栈顶弹出一个工作记录,则当前执行层的工作记录必须是递归工作栈栈顶的工作记录,称这个记录为“活动记录”,并称指示活动记录的栈顶指针为“当前环境指针”。 递归工作栈 */44 分治算法 分治算法与软件设计的模块化方法类似。为了解决一个大的问题,将一个规模为n的问题分解为规模较小的子问题,这些子问题互相独立并且和原问题相同。分别解这些子问题,最后将将各个子问题的解合并得到原问题的解。 子问题通常与原问题相似,可以递归地使用分治策略来解决。 设计递归算法的方法 递归算法就是在算法中直接或间接调用算法本身的算法。 使用递归算法的前提有两个: ⑵规模最小的子问题具有直接解。 ⑴原问题可以层层分解为类似的的子问题,且子问题比原问题的规模更小。 设计递归算法的方法 ⑴寻找分解方法 ⑵设计递归出口 */44 递归算法具有两个特性: (1) 递归算法是一种分而治之、把复杂问题分解为简单问题的求解问题方法,对求解某些复杂问题,递归算法的分析方法是有效的。 (2)递归算法的效率较低。 */44 */44 例:Hanoi塔问题 传说在古代印度的贝拿勒圣庙里,安装着三根插至黄铜板上的宝石针,印度主神梵天在其中一根针上从下到上由大到小的顺序放64片金圆盘,称为梵塔,然后要僧侣轮流值班把这些金圆盘移到另一根针上,移动时必须遵守如下规则:

文档评论(0)

1亿VIP精品文档

相关文档