- 1、本文档共57页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
教学课件课件PPT医学培训课件教育资源教材讲义
当一个函数在运行期间调用另一个函数时,在运行该被调用函数之前,需先完成三件事: 1) 将所有的实在参数、返回地址等信息传递给被调用函数保存; 2) 为被调用函数的局部变量分配存储区; 3) 将控制转移到被调用函数的入口。 而从被调用函数返回调用函数之前,应该完成: 1) 保存被调函数的计算结果; 2) 释放被调函数的数据区; 3) 依照被调函数保存的返回地址将控制转移到调用函数。 当多个函数嵌套调用时,由于函数的运行规则是:后调用先返回,因此各函数占有的存储管理应实行“栈式管理”。 假设主函数调用函数A,函数A又调用函数B,显然,在函数B运行期间主函数和函数A占用的存储都不能被覆盖,反之,当函数B运行结束,它所占用的存储区便可释放,同时因为程序控制转移到函数A,当前程序访问的数据自然就是函数A占用的存储区了。 采用递归算法求解正整数n的阶乘n! 数学定义 求n的阶乘的递归函数算法如下: long fact(int n) { long f; if(n==0) f=1; else f=n*fact(n-1); return f; } 函数fact(4)的递归调用过程的执行流程 汉塔问题 解题思路: 1.如果有人能将A中上面的n-1个盘子,经过C能搬道B,那么就可以将所有盘子搬到C. 假如能将A中上面的n-1盘子经过C搬到B 将第n个盘子从A搬到C 显然也可以将B中n-1个盘子经过A搬到C 关键是能将n-1个盘子经过C搬到B 2.如果能将B中上面的n-2个盘子,经过C能搬道A,那么就可以将所有n-1盘子搬到C. …. N-1.如果能将B中的两个盘子搬到C,问题就解决了. void hanoi(int n,char one,char two,char three) { if(n==1) move(one,three); else { hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); } } void move(char x,char y) { printf(“%c--%c\n”,x,y); } void main() { int m; scanf(“%d”,m); hanoi(m,’A’,’B’,’C’); } 栈练习 1.在作进栈运算时,应先判别栈是否( ① ),在作退栈运算时应先判别栈是否( ② )。当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为( ③ )。 为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空间时,应将两栈的 ( ④ )分别设在这片内存空间的两端,这样,当( ⑤ )时,才产生上溢。 ①, ②: A. 空 B. 满 C. 上溢 D. 下溢 ③: A. n-1 B. n C. n+1 D. n/2 ④: A. 长度 B. 深度 C. 栈顶 D. 栈底 ⑤: A. 两个栈的栈顶同时到达栈空间的中心点. B. 其中一个栈的栈顶到达栈空间的中心点. C. 两个栈的栈顶在栈空间的某一位置相遇. D. 两个栈均不空,且一个栈的栈顶到达另一个栈的栈底. B,A,B,D,C 2.一个栈的输入序列为123…n,若输出序列的第一个元素是n,输出第i(1=i=n)个元素是( )。 A. 不确定 B. n-i+1 C. i D. n-i B 3.若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pN,若pN是n,则pi是( )。 A. i B. n-i C. n-i+1 D. 不确定 D 4.一个栈的输入序列为1 2 3 4 5,则下列序列中不可能是栈的输出序列的是( )。 A. 2 3 4 1 5 B. 5 4 1 3 2 C. 2 3 1 4 5 D. 1 5 4 3 2 B 5.表达式a*(b+c)-d的后缀表达式是( )。 A.abcd*+- B. abc+*d- C. abc*+
文档评论(0)