- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
递归的概念与基本思想.ppt
递归策略
递归的概念与基本思想
一个函数、过程、概念或数学结构,如果在其定义或说明内部又直接或间接地出现有其本身的引用,则称它们是递归的或者是递归定义的。在程序设计中,过程或函数直接或者间接调用自己,就被称为递归调用。
递归的概念与基本思想
递归过程是借助于一个递归工作栈来实现的
问题向一极推进,这一过程叫做递推;
而问题逐一解决,最后回到原问题,这一过程叫做回归。
递归的过程正是由递推和回归两个过程组成。
递归的概念与基本思想
用递归算法求 n!
定义:函数 fact( n ) = n!
fact( n-1 ) = ( n-1 )!
则有 fact( n ) = n *fact( n-1 )
已知 fact( 1 ) = 1
练习写出相应的代码
5
下面画出了调用和返回的递归示意图
递归的概念与基本思想
递归实现的代价是巨大的栈空间的耗费,那是因为过程每向前递推一次,程序将本层的实在变量(值参和变参)、局部变量构成一个“工作记录”压入工作栈的栈顶,只有退出该层递归时,才将这一工作记录从栈顶弹出释放部分空间。由此可以想到,减少每个“工作记录”的大小便可节省部分空间。例如某些变参可以转换为全局变量,某些值参可以省略以及过程内部的精简。
递归的概念与基本思想
示例:求a[1..n]的最大者。
有如下过程:
Procedure findmax(i:integer;var max:integer);
var j:integer;
begin
max:=a[i];
if i=n
then exit
else begin
findmax(i+1,j);
if jmax then max:=j;
end;
end;
递归的概念与基本思想
起始状态就是调用findmax(1,max),而像上述过程中的变参max完全可以省略。将上述方法修改可得下面的算法:
Procedure findmax(i:integer);
begin
if i=n
then exit
else begin
findmax(i+1);
if a[i]max then max:=a[i];
end;
end;
递归的概念与基本思想
起始状态就是调用findmax(1) ,max为全局变量,同时还减少了一个局部变量的使用。尽管这只是一个很简单的例子,在本例中不做精简,程序也还是能通过,但它精简的原则对其它使用递归的程序而言却是同样适用的。特别是在递归过程出现堆栈溢出情况时就应该考虑这一问题。
递归的概念与基本思想
采用递归方法编写的问题解决程序具有结构清晰,可读性强等优点,且递归算法的设计比非递归算法的设计往往要容易一些,所以
当问题本身是递归定义的,或者问题所涉及到的数据结构是递归定义的,或者是问题的解决方法是递归形式的时候,往往采用递归算法来解决。
经典递归 例如hanoi塔问题:经典的递归,原问题包
含子问题。有些问题或者数据结构本来就是递归
描述的,用递归做很自然。
递归可以转化为非递归
递归转化为非递归的方法有很多,最标准的方法就是利用栈来实现。关键在于我们要掌握递归算法的实质:重复执行相同的算法,但其处理的数据发生了变化,因此对许多递归程序,我们可以用循环结构来完成,只要处理好变量、地址等关系就可以将递归转化为非递归。
递归的基本思想
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。因此,在考虑使用递归算法编写程序时,应满足两点:
1)该问题能够被递归形式描述;(且是有限次的)
2)存在递归结束的边界条件。
递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。
例如计算第n个斐波那契数的递归算法书p184
但在用递归算法时,只要输入的n值稍大,程序求解就很困难, 而递推则效率高很多。如果将自然数n的范围扩大到1500以内,则用递归算法递归调用的次数过多,在求800以上的数的时候就会出现困难,但用递推却可以大大缩小问题的规模。
递归的缺陷
递归的很多问题可以转为递推来处理,通常递推处理的效率比递归高得多。比如象阶乘、Fibonacci数列等。它们的相邻数之间有着明显的规律性的变化,通常可以将递归结束的条件作为递推的初始条件,并利用这种规律性一步一步递推到结果。这种递推通常采用循环迭代的方法,如循环累乘、循环累加等。
var f0,f1,f2:real;
??? i,n:byte;
begin
??? readln(n);
?
原创力文档


文档评论(0)