- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
程序的设计中递归函数教学问题探究
程序的设计中递归函数教学问题探究
摘要:递归问题是程序设计语言教学中的一个重点、难点内容,针对递归教学的教学特点,阐述递归函数的精髓和教学方法,提出将理论和实践结合起来,通过剖析学生在学习递归函数时产生的错误和误区,应用实例和类比策略帮助学生解决递归函数学习中存在的问题,取得了事半功倍的教学效果。
关键词:递归函数;递归教学;程序设计基础
递归是计算技术中的重要概念之一,与递归有关的概念有递归关系、递归数列、递归过程、递归算法、递归程序、递归方法。递归不仅应用于算法与程序设计之中,还广泛地应用于定义序列、函数和集合等各个方面。对递归的理解和应用,有助于提高学生的计算思维。
尽管递归的概念很重要,但部分学生对递归的理解和应用还较为困难,尤其对刚接触程序设计的初学者来说,什么场合下使用递归的方法,使用递归的方法应注意哪些问题等还存在不少困惑。本文针对递归函数教学中的一些教学方法进行了探讨,对学生容易产生问题的知识点进行了着重阐述,让学生牢固掌握递归程序设计方法,将所学知识融会贯通以解决实际问题。
1递归函数
递归函数指的是函数直接或间接地调用“自身”。从图1中可以看到,这两种递归调用都是无终止的自身调用,显然在程序中不应出现这种无终止的调用,而只应出现有限次数、有终止的调用。在以上的关于递归函数的定义中,调用自身中的“自身”两个字加上了引号。若不加引号,就会出现循环定义的问题。事实上,递归是以比自身简单一些的说法来定义的,即在计算结构相同的情况下,使计算的规模小于自身[1]137。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
2递归的精髓与设计难点
递归算法在可计算性理论中占有重要地位,它是算法设计的有力工具,对于拓展编程思路非常有用[2]。就递归算法而言并不涉及高深数学知识,只不过初学者要建立起递归概念不十分容易。因此,在教学中所采用的教学线路是先用一个简单的例子导入递归的概念,归纳出递归的要素;接下来采用实例教学的形式,给出递归执行的过程,让学生对递归建立感性认识;接下来给出递归问题的求解过程,一般分为数值型递归问题和非数值型递归问题,由于学生对数值型递归问题的理解要好一些,所以首先给出数值型递归问题求解再介绍非数值型递归问题求解。
2.1递归函数的执行过程
在教学中首先从一个简单的递归程序开始分析递归程序求n的阶乘的执行过程,通过对递归程序的执行的分析,可以打消初学者对递归程序功能的怀疑心理。n的阶乘是这样定义的:
0!= 1
n!= n #8226; (n-1)!(n1)
图2以求3!为例,分析递归函数fact(n)的执行过程,求n!程序见2.2节。3!=3*2!,2!=2*1!,1!=1*0!=1*1=1,知道了1!=1再反过来算回去,2!=2*1!=2*1=2,3!=3*2!=3*2=6。
int main()
{int p;
p=fact(3);
printf(“%d”p);
}
1)main()函数有一个局部变量p,如图2所示。
图2递归函数fact的执行过程
2) 每次调用函数时为参数和局部变量分配存储空间,退出函数时释放它们的存储空间。调用fact (3)时要分配参数和局部变量的存储空间,其中n已初始化为3。
3)fact (3)又调用fact (2),又要fact (2)的参数和局部变量分配存储空间,其中n已初始化为2。fact (3)和fact (2)是两次不同的调用,fact (3)的参数n和fact (2)的参数n各有各的存储单元,虽然在写代码时只写了一次参数n,但运行时却是两个不同的参数n。并且由于调用fact (2)时fact (3)还没退出,所以两个函数调用的参数n同时存在。
4) 以此类推,可以得到整个调用过程。这个过程和前面我们用数学公式计算3!的过程是一样的,都是先一步步展开然后再一步步收回。
在计算机系统中,执行递归函数是通过栈来实现的。当主函数main()调用阶乘函数fact()时,系统就自动为递归建立一个工作栈,栈中每个结点就是一次递归调用的数据区。函数被调用时,则栈内增加一个与其对应的结点,当函数调用完毕后(注意包括它调用的子函数),与其对应的结点出栈。增加一层递归,栈内就要增加一个结点;反之,当结束一层递归调用,栈内就要删除一个结点。
递归函数的执行过程依然是普通的函数调用过程,所谓递归函数调用自身,实质上是一系列的函数顺序执行的结果,只不过这些函数有相同的代码段,但是有不同的数据段。所谓递归的层次就是函数调用
原创力文档


文档评论(0)