科技信息 0 IT论坛0 SCIENCE&TECHNOLOGY INFORMATION 2010年第35期 谈C语言函数的递归和调用 张俊飞 (1.上饶职业技术学院调用的方式来解决此类问题 江西上饶334109;2.华东交通大学江西南昌330000) 【摘 要】在一个大问题中包含若干个层次的子问题,并且这些子问题的性质相同只是规模教母问题较小,那么这时候我们可以采用递归和 【关键词】若干个层次的子问题;递归;调用 0u the C language and Call the Recursive Function 【Abstract]Contains a major problem in several levels of sub—problems,and these sub-problems of the same nature but smaller—scale problems godmother,this time we can use reeursion and calls to resolve the problem. 【Key words】Several levels of sub—problems;Recursive;Call 0前言printf(“\Il%d!=%d kn”,m,y); 要 , 、递 :可以直接(简单递归)或间接 }’ (间接递归)地自己调自己。主要包括: (1)c语言函数可以递归调用。 (2)可以通过直接或间接两种方式调用。目前只讨论直接递归调 用。 3递归说明 当函数自己调用自己时,系统将自动把函数中当前的变量和形参 暂时保留起来,在新一轮的调用过程中,系统为新调用的函数所用到 的变量和形参开辟另外的存储单元(内存空间)。每次调用函数所使用 的变量在不同的内存空间。 1 递归条件 采用递归方法来解决问题,必须符合以下三个条件: 1.1可以把要解决的问题转化为一个新问题.而这个新的问题的解 决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或 递减。 递归调用的层次越多.同名变量的占用的存储单元也就越多。一 定要记住.每次函数的调用,系统都会为该函数的变量开辟新的内存 空间。 当本次调用的函数运行结束时,系统将释放本次调用时所占用的 1.2可以应用这个转化过程使问题得到解决。 1.3必定要有一个明确的结束递归的条件。 内存空间。程序的流程返回到上一层的调用点,同时取得当初进入该 2递归实例 例:使用递归的方法求n! 当n>l时,求n!的问题可以转化为n 【n一1)!的新问题。 比如n=5:第一部分:5*4*3*2 1 n (n一1)! 第二部分:4*3 2"1(n—1) (n一2)! 层时,函数中的变量和形参所占用的内存空间的数据。 所有递归问题都可以用非递归的方法来解决,但对于一些比较复 杂的递归问题用非递归的方法往往使程序变得十分复杂难以读懂,而 函数的递归调用在解决这类问题时能使程序简洁明了有较好的可读 性;但由于递归调用过程中,系统要为每一层调用中的变量开辟内存 空间、要记住每一层调用后的返回点、要增加许多额外的开销,因此函 数的递归调用通常会降低程序的运行效率。 4程序流程 第三部分:3*2 1(n一2)(n一3)! 第四部分:2 1(n一3)(n一4)! 第五部分:1(n一5)1 5-5=0,得到值1,结束递归。 源程序:fac(int n1 {intt; fae(int n1,术每次调用使用不同的参数 / f int t; 每次调用都会为变量t开辟不同的内存空间 , i“n==1)II(n==o),半当满足这些条件返回1 , return 1; if(n==1)ll(n==O)return 1; else else t; 一{t=n fae(n-1); returnf t=n*fac(n一1); 每次程序运行到此处会用n一1作为参数再调用 次本函数 此处是调用点 / retnrn t: 只有在上一句调用的所有过程全部结束时才运行到此 ) ) main() (int m,y; prinff(“Enter m:”1: 处。 / ) 【参考文献】 [1]占跃华,编.C语言程序设计.北京邮电大学出版社,2008 scanf(“%d”,&m); if(m(0)printt(“Input data Error!\n”); else [2]http://zhidao.baidu.com/questiord32057953.htm1. {y=fac(m); [责任编辑:曹明明] (上接第156页)演示基本数学概念、定理,有效的避免了传统教学枯 燥乏味的弊端 社.2004. 【参考文献】 [1]同济大学数学教研室,编.高等数学:上、下册[M].5版.北京:高等教育出版 总之,在高等教育中,高等数学教学不仅是传授给学生基础知识, J].数学教育学报,2000,9(4):70. 更重要的是培养学生的数学素质及逻辑思维能力。作为2l世纪的教 [2]王高峡.再谈美国的微积分教学改革[育工作者,我们有责任积极思考、积极探索出行之有效的培养学生能 力的教学方法,以适应新形势的需求。 [责任编辑:张慧]