计算机算法基础(第3递归算法.ppt
《计算机算法基础(第3递归算法.ppt》由会员分享,可在线阅读,更多相关《计算机算法基础(第3递归算法.ppt(52页珍藏版)》请在三一办公上搜索。
1、递归算法(Recursion),本章内容递归算法的实现机制递归化为非递归(难点)递归算法举例递归算法复杂性的计算(重点和难点),递归(Recursion)定义,直接或间接地调用自身的算法称为递归算法直接或间接调用自身的函数称为递归函数尾递归是指递归调用的语句在递归函数的最后一句递归算法的特点:用于解决一类递归定义的问题算法易于实现,简单明了,3.1 递归算法的实现机制,递归算法通过子程序/函数来实现子程序调用的形式参数传递和返回值的传送子程序调用的内部操作,1 子程序的调用形式,STACK,子程序/函数调用形式,关键:用栈保存返回地址用寄存器保存返回地址(某些嵌入式处理器),2 参数传递和返回
2、值的回传,参数传递按值的传送(值调用)按地址的传送(引用调用)两次值的传送地址的传送函数的返回值通过寄存器传递(AX/EAX)通过全局变量的传送例如 C+中的引用类型,一些脚本语言的引用变量类型都是按地址传送的例子,参数的传递,值参数(value parameter)用于输入参数的传递。一个值参数相当于一个局部变量,只是它的初始值来自为该形参传递的实参。对值参数的修改不影响为该形参传递的实参。引用参数(reference parameter)用于输入和输出参数传递。引用参数与实参变量表示同一存储位置,对值参数的修改直接影响为该形参传递的实参。,函数参数和函数的值,1 函数间的按值传递,在定义函
3、数时函数名后面括弧中的变量名称为“形式参数”(简称“形参”),在主函数中调用一个函数时,函数名后面括弧中的参数(或表达式)称为“实际参数”(简称“实参”)。return后面的括弧中的值 称为函数返回值,例1调用函数时的数值传递,#include“iostream.h”void main()int x=5,y=10;swap(x,y);coutx“t”yendl;,例 交换函数 void swap(int a,int b)int temp;temp=a;a=b;b=temp;,运行结果:510,main函数在调用swap函数形式参数为a和b,实际参数为x和y,各自有不同的内存单元a和b交换时,并
4、不能影响x和y的值。这是按值传递的特性,2 函数间的地址传递,#include“iostream.h”void main()int x=5,y=10;swap(,例 交换函数 void swap(int*a,int*b)int temp;temp=*a;*a=*b;*b=temp;,运行结果:105,main函数在调用swap函数时,参数加了取地址运算符&,表示变量x和y的内存地址。形式参数为*a和*b,表示a和b是指针变量,*a和*b分别是指针a和b的内容。,3 函数间的引用传递,#include“iostream.h”void main()int x=5,y=10;swap(x,y);co
5、utx“t”yendl;,例 交换函数 void swap(int,运行结果:105,形式参数为&a和&b,即引用形式参数对引用形式参数的操作即对实际参数本身的操作,3子程序调用的内部操作,Caller:(主调函数)在栈顶为形式参数开辟空间计算实参值并赋给栈顶的形参返回地址入栈指令流转向被调函数的入口Callee:(被调函数)初始化:局部量保存在堆栈中从堆栈中取出形参运算返回:将返回值保存到回传变量中从栈中取出返回地址指令流转到返回地址处继续执行程序,递归程序的内部实现,内部实现和函数调用类似,代码只有一份优点:简单明了结构清晰,可读性强容易用数学归纳法来证明算法的正确性缺点:运行效率较低入/
6、出栈次数多,影响计算时间对系统栈的空间占用大,递归层次多时,容易导致栈溢出同一个函数多次的重复调用,开销大,3.2 递归化为非递归,直接递归化为非递归(迭代)原则:在过程的开始部分,初始化用户栈(替代系统栈),增加一个全局变量retvalue用于保存返回值建立标号:分别在过程的第一条可执行语句处、每个递归调用处建立标号,依次为:L0,L1,L2,,做为入口地址和返回地址消去递归调用:局部变量、形参、返回地址入栈,形式参数赋值,goto语句到L0修改函数的返回部分:用户栈为空,返回返回值保存到全局变量中,同时将引用参数赋给栈顶的相应变量取出返回地址,恢复现场。(即恢复主调函数的局部量、参数等,注
7、意栈的平衡)转向返回地址处执行,int GCD(unsigned int a,unsigned int b)int res;if(a b)res=GCD(b,a);else if(b=0)res=a;elseres=GCD(b,a%b);return res;,a=b*r+q其中0=qb则:(a,b)=(b,q)=(D,0)D 为a,b的最大公因数,int GCD(unsigned int a,unsigned int b)CStack stack;int retvalue,retaddr;int res;L0:if(a b)res=GCD(b,a);L1:;else if(b=0)res=a
8、;elseres=GCD(b,a%b);L2:;return res;,建立用户栈设置临时变量-(返回值和返回地址)建立标号(入口地址和返回地址列表),int GCD(unsigned int a,unsigned int b)CStack stack;int retvalue,retaddr;int res;stack.push(a);stack.push(b);L0:b=stack.pop();a=stack.pop();/从堆栈取参数if(a b)res=GCD(b,a);L1:;else if(b=0)res=a;else res=GCD(b,a%b);L2:;return res;,
9、从堆栈中取参数,GCD例,参数的传递可以不用stack恢复现场后a,b不再使用,所以不用保护a,b标号L0,L1,L2中,栈里保存的不可能是L0,L1也可以去掉,于是栈里的返回地址总是L2,返回地址也可以不用保存参数res也不需要保存在栈里用户栈就可以取消,3.3 递归算法设计,可用递归解决的问题P问题P具有规模不同规模的问题P,具有相同性质;并且大规模的问题由小规模的问题构成小规模的问题是可解的关键:找到递归的递推关系找到结束递归的条件,递归求解的伪代码,procedure P(参数表)beginif 满足递归出口then 简单操作;elsebegin简单操作;CALL P;简单操作;end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 算法 基础 递归
链接地址:https://www.31ppt.com/p-6606591.html