程序设计中递归函数教学问题探究.doc
《程序设计中递归函数教学问题探究.doc》由会员分享,可在线阅读,更多相关《程序设计中递归函数教学问题探究.doc(11页珍藏版)》请在三一文库上搜索。
1、程序设计中递归函数教学问题探究 递归问题是程序设计语言教学中的一个重点、难点内容,针对递归教学的教学特点,阐述递归函数的精髓和教学方法,提出将理论和实践结合起来,通过剖析学生在学习递归函数时产生的错误和误区,应用实例和类比策略帮助学生解决递归函数学习中存在的问题,取得了事半功倍的教学效果。 递归是计算技术中的重要概念之一,与递归有关的概念有递归关系、递归数列、递归过程、递归算法、递归程序、递归方法。递归不仅应用于算法与程序设计之中,还广泛地应用于定义序列、函数和集合等各个方面。对递归的理解和应用,有助于提高学生的计算思维。 尽管递归的概念很重要,但部分学生对递归的理解和应用还较为困难,尤其对刚
2、接触程序设计的初学者来说,什么场合下使用递归的方法,使用递归的方法应注意哪些问题等还存在不少困惑。本文针对递归函数教学中的一些教学方法进行了探讨,对学生容易产生问题的知识点进行了着重阐述,让学生牢固掌握递归程序设计方法,将所学知识融会贯通以解决实际问题。 1递归函数 递归函数指的是函数直接或间接地调用“自身”。从图1中可以看到,这两种递归调用都是无终止的自身调用,显然在程序中不应出现这种无终止的调用,而只应出现有限次数、有终止的调用。在以上的关于递归函数的定义中,调用自身中的“自身”两个字加上了引号。若不加引号,就会出现循环定义的问题。事实上,递归是以比自身简单一些的说法来定义的,即在计算结构
3、相同的情况下,使计算的规模小于自身1137。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 2递归的精髓与设计难点 递归算法在可计算性理论中占有重要地位,它是算法设计的有力工具,对于拓展编程思路非常有用2。就递归算法而言并不涉及高深数学知识,只不过初学者要建立起递归概念不十分容易。因此,在教学中所采用的教学线路是先用一个简单的例子导入递归的概念,归纳出递归的要素;接下来采用实例教学的形式,给出递归执行的过程,让学生对递归建立感性认识;接下来给出递归问题的求解过程,一般分为数值型递归问题和非数值型递归问题,由于学生对数值型递归问题
4、的理解要好一些,所以首先给出数值型递归问题求解再介绍非数值型递归问题求解。 2.1递归函数的执行过程 在教学中首先从一个简单的递归程序开始分析递归程序求n的阶乘的执行过程,通过对递归程序的执行的分析,可以打消初学者对递归程序功能的怀疑心理。n的阶乘是这样定义的 0!= 1 n!= n • (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(
5、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
6、)时fact (3)还没退出,所以两个函数调用的参数n同时存在。 4) 以此类推,可以得到整个调用过程。这个过程和前面我们用数学公式计算3!的过程是一样的,都是先一步步展开然后再一步步收回。 在计算机系统中,执行递归函数是通过栈来实现的。当主函数main()调用阶乘函数fact()时,系统就自动为递归建立一个工作栈,栈中每个结点就是一次递归调用的数据区。函数被调用时,则栈内增加一个与其对应的结点,当函数调用完毕后(注意包括它调用的子函数),与其对应的结点出栈。增加一层递归,栈内就要增加一个结点;反之,当结束一层递归调用,栈内就要删除一个结点。 递归函数的执行过程依然是普通的函数调用过程,所谓递
7、归函数调用自身,实质上是一系列的函数顺序执行的结果,只不过这些函数有相同的代码段,但是有不同的数据段。所谓递归的层次就是函数调用的深度。由于递归函数有相同的处理过程,因此用于表示递归调用的栈的结点是相同的结构类型,而一般的函数调用有不同的形参表。 2.2数值型递归问题的求解 数值型递归问题一般都有明确的递推公式和初始条件,对于这类递归问题编写递归程序的一般方法是建立递归数学模型,确立递归终止条件,将递归数学模型转换为递归程序3。从数学公式入手,推出问题的递归定义,然后确定问题的边界条件,这样就可以确定递归的算法和递归结束条件。下面的例子为用递归算法求n!。 定义函数fact(n)=n!,fac
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 递归 函数 教学 问题 探究
链接地址:https://www.31doc.com/p-1852153.html