- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于C語言的递归函数教学方法探讨
基于C语言的递归函数教学方法探讨
摘要:本文从实际教学出发,首先讨论了递归的基本条件,总结出递归程序的设计方法,然后详细分析递归程序的执行过程并给出了递归程序的一般结构,最后让学生自己分析汉诺塔问题并动手写程序,在教学中取得了较好的效果。br 关键词br本文来自:计算机毕业网 :函数;递归;教学br br 1引言br br C语言一般作为计算机及相关专业的第一门语言,它是后续计算机课程的基础,学生对它的掌握程度直接影响到后续课程的学习。函数是C语言中一个非常重要的部分,所有程序都是由函数组成的,如果没有掌握函数,就不可能掌握C语言。在函数中,递归函数是一类比较难以掌握的问题,学生在学习过程中往往对这类程序的执行过程不了解,对递归问题的认识不清楚,难以写出正确的递归程序。针对递归问题的教学,人们在实践中做了很多有益的探讨,也有一些教材对这一问题做了较为细致的分析。但以上工作大都以汉诺塔问题进行讲解,而汉诺塔问题本身较为复杂,很多学生一下难以掌握该程序的执行过程。本文从实际教学出发,首先分析递归的基本条件,从简单程序开始分析,写出递归程序,然后一步一步分析递归程序的执行过程,让学生对递归有更深入的理解。然后写出递归程序的一般结构,最后分析汉诺塔问题,让学生自己写出程序。br br 2递归的基本条件br br 一般情况下采用递归方法来解决问题,必须符合以下三个条件:br a. 可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的问题的规模有规律地递减。也就是说解决问题的方法相同,调用函数的参数每次不同(有规律地递减),如果没有规律也就不能运用递归方法求解。br b. 每个子问题必须比原来问题的规模更小,即使小一号也行,如果能够迅速减小规模更好。br c. 必定要有一个明确的结束递归的条件。当问题的规模达到一定程度时(一般的时候应该是规模足够小),问题的解是已知的,在这个地方能结束递归调用,不然可能导致系统崩溃或陷入死循环。br br 3递归问题分析br br 递归程序最少有两种方法可以写出。第一种是想办法把问题转化为数学表达式,能用数学表达式写出的,可以直接把数学表达式变为程序;第二种是按照递归的基本条件,分析所给问题的结构,一个问题总具有一定的规模,想办法把规模变小,使小规模的问题与原问题具有相同的解法,当规模足够小时,该问题的解是已知的,这时可以套用后面所讲的一般递归程序的结构来写递归程序。br 例1:求n!。经过分析n!可以表示为br br 假定n!是一个long型,则直接写出程序如下:br long func(int n) //求n!br {if(n==1 || n==0)br return 1;br return n*func(n-1);br } br br 例2:求Fibonacci数列(非波纳契)的第n项,该数列表示如下:br br 按照例1的方法,写出程序如下:br longfib(int n) br { if( (n==1||(n==2) )br ① return 1;br else br ② return fib(n-1)+fib(n-2); br } br 如输入n=4,程序(具体程序用行标号代替)的执行过程如图1所示,通过分析以上程序,大部分学生对递归函数的执行过程有了较为清晰的认识。br 例3:用递归的方法将一个正整数n按位输出,如输入2008,输出2 0 0 8,n的位数不确定,可以是任意正整数。br 分析:br ① 函数应该是处理整数n,并且是输出,用PrintNum(int n)来实现这一功能;br ② 如果n的规模很小(只有1位),可以直接输出后结束程序;(这里应该知道n的位数是问题的规模)br ③ 把问题的规模变小,去掉n的某1位(在实际讲解时是去掉个位,因为去掉个位比较容易一些,我们用k=n%10保存个位,n=n/10就可以去掉个位),余下位形成一个新的规模比原数小的数,再在新数上递归调用函数,这个新数按要求输出后,去掉的这一位因为是个位,所以应该把它输出到新数的后面。br br 通过以上分析,写出程序如下:br void PrintNum(int n)/*该函数能把n按要求输出*/br { int k;br if(n10){ printf(%2d,n); return ;} /*如果规模很小,则直接处理后结束程序*/br k=n%10; /*在n中提出个位数字*/br PrintNum(n/10);/*把规模更小的子问题递归调用函数来处理*/br printf(%2d,k);
文档评论(0)