- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
论文题目:栈与递归的关系
年 级
专 业信息与计算科学101
姓 名
学 号
日期: 2012.11.1
目 录
内容提要-----------------------------------------------3
关键字--------------------------------------------------3
正文
第一部分:递归的设计步骤---------------------------------4
第二部分:举例说明-----------------------------------------4
(1)进制转换的栈与递归的实现------------------------5
(2)算阶乘的栈与递归的实现---------------------------7
hanio塔的栈与递归的实现------------------------9
第三部分:
阐述递归与栈的关系(递归在计算机中的实现以阶乘为例)----------------------------------------------------------10
总结------------------------------------------------------12
参考文献------------------------------------------------13
栈与递归的关系
内容提要
计算机执行递归算法时,是通过栈来实现的。具体说来,就是在(递归过程或递归函数)开始运行时,系统首先为递归建立一个栈,该栈的元素类型(数据域)包括值参、局部变量和返回地址;在每次执行递归调用语句时之前,自动把本算法中所使用的值参和局部变量的当前值以及调用后的返回地址压栈(一般形象地称为“保存现场”,以便需要时“恢复现场”返回到某一状态),在每次递归调用结束后,又自动把栈顶元素(各个域)的值分别赋给相应的值参和局部变量(出栈),以便使它们恢复到调用前的值,接着无条件转向(返回)由返回地址所指定的位置继续执行算法。关键词
(1) 递归
所谓递归是指:若在一个函数、过程或者数据结构定义的内部,直接(或间接)出现定义本身的应用,则称它们是递归的,或者是递归定义的。
递归是一种强有力的数学工具,它可使问题的描述和求解变得简洁和清晰。
递归算法常常比非递归算法更易设计,尤其是当问题本身或所涉及的数据结构是递归定义的时候,使用递归算法特别合适
(2)递归算法的设计步骤
第一步骤(递归步骤):将规模较大的原问题分解为一个或多个规模更小、但具有类似于原问题特性的子问题。即较大的问题递归地用较小的子问题来描述,解原问题的方法同样可用来解这些子问题。
第二步骤:确定一个或多个无须分解、可直接求解的最小子问题(称为递归的终止条件)。
在递归算法的内部实现中所起的作用。
①调用函数时:系统将会为调用者构造一个由参数表和返回地址组成的活动记录,并将其压入到由系统提供的运行时刻栈的栈顶,然后将程序的控制权转移到被调函数。若被调函数有局部变量,则在运行时刻栈的栈顶也要为其分配相应的空间。因此,活动记录和这些局部变量形成了一个可供被调函数使用的活动结构。
注意:
参数表的内容为实参,返回地址是函数调用语句的下一指令的位置。
②被调函数执行完毕时:系统将运行时刻栈栈顶的活动结构退栈,并根据退栈的活动结构中所保存的返回地址将程序的控制权转移给调用者继续执行。
注意:这个程序主要是想要阐述下递归与栈的关系,上面说,系统在执行递归函数时系统会自动的分配空间,这里是自己建立一个栈,然后把运算的数据放在里面。
(2)用递归算法求N阶乘(N!=1*2*3*……*N,N20);
#includestdio.h
main()
{ float fac(int n);
int n;
float y;
printf(请输入要求的数据的阶乘\n);
scanf(%d,n);
y=fac(n);
printf(********************************\n);
printf(%d!=%.0f\n,n,y);
printf(**
文档评论(0)