- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
(递归一)概要1
递 归 在调用过程或函数之前,系统需完成三件事: ⑴为被调用过程的局部变量分配存储区; ⑵将所有的实在参数、返回地址等信息传递给被调用过程保存; ⑶将控制转移到被调过程的入口。 从被调用过程返回调用过程之前,系统也应完成三 件工作: ⑴保存被调过程的计算结果; ⑵释放被调过程的数据区; ⑶依照被调过程保存的返回地址将控制转移到调用过程。 递归过程分析—数字倒序 * * 我们把自己内部又有自己本身的这种情况叫做递归。 procedure a; begin . . . a; . . . end; 这种方式是直接调用. procedure b; procedure c; begin begin . . . . . c; b; . . . . end; end; 这种方式是间接调用. 一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数). 递 归 pascal语言中,如果在一个函数、过程等定义内部又直接或间接地出现有对自身的引用,则称它们是递归的或者是递归定义的。 在程序中,递归是通过函数或过程的调用来实现的。函数或过程直接调用其自身,称为直接递归;函数或过程间接调用其自身,称为间接递归。 如何设计递归算法 1.确定递归公式 2.确定边界(终了)条件 例1 阶乘函数 阶乘函数可递归地定义为: 边界条件与递归方程是递归函数的二个要素,递归函数只有具备了这两个要素,才能在有限次计算后得出结果。 边界条件 递归方程 program ex1; var n:integer; s:longint; begin readln(n); s:=fac(n); writeln(n,‘!=’,s) end. function fac(a:integer):longint; var t:longint; begin t:=1; for i:=2 to a do t:=t*i; fac:=t; end; function fac(a:integer):longint; begin if a=0 then fac:=1 else fac:=a*fac(a-1); end; n! N!可以由下列公式表示: 输入一串以‘!’结束的字符,按逆序输出。 字符串 字符数组 输入:abc! 输出:!cba program ex2; procedure rever; var c:char; begin read(c); if c’!’ then rever; write(c); end; begin {主程序} rever; end. 输入一串以‘!’结束的字符,按逆序输出。 输入 hey! 输出 !yeh。 procedure rever; var c:char; begin read(c); if c! then rever; write(c); end; hey! procedure rever; var c:char; begin read(c); if c! then rever; write(c); end; procedure rever; var c:char; begin read(c); if c! then rever; write(c); end; procedure rever; var c:char; begin read(c); if c! then rever; write(c); end; c=‘e’ c=‘y’ c=‘!’ c=‘h’ 程序中,c 是过程rever的局部变量。每一次递归调用,都要为局部变量重新分配单元,因此各层的变量c实际上是不同的变量,它们分别用于保存执行本层调用时的输入值。 program ex2;
文档评论(0)