c语言函数递归调用_第1页
c语言函数递归调用_第2页
c语言函数递归调用_第3页
c语言函数递归调用_第4页
c语言函数递归调用_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

c语言函数递归调用在调用一个函数的过程中又出现直接或间接地调用该函数本身,这种用法称为函数的递归调用。例如:intf(intx){intx,z;z=f(x);//在执行f函数的过程中又要调用f函数return(2+z);}在调用函数f的过程中,又要调用f函数(本函数),这是直接调用本函数。如果在调用f1函数过程中要调用f2函数,又在调用f2的数过程中又要调用f1,这就是间接调用本函数。这两种递归调用都是无终正的自身调用,程序中不应出现这种无终止的递归调用,只应出现有限次数的、有终止的递归调用,用if语句来控制,只有在某一条件成立时才继续执行递归调用:否则就不再继续。如n=1;c=10,没有条件一直调用,有条件把递归调用变已知值,无调用函数,消失了。例:有5个学生坐在一起,问第5个学生多少岁,他说比第4个学生大2岁,问第4个学生岁数,他说比第3个学生大2岁。问第3个学生,又说比第2个学生大2岁,问第2个学生,说比第1个学生大2岁。最后问第1个学生,他说是10岁。请问第5个学生多大。每一个学生的年龄都比其前1个学生的年龄大2。说明共用一个函数关系。可以用数学公式表述如下:age(n)=10(n=1)age(n)=age(n-1)+2(n>1)当n>1时,不断调用同一个函数,就是一个递归问题。回溯将第5个学生的年龄表示直到第1个学生的年龄。此时age(1)已知等于10,没有可调用函数,出现已知值,不再出现调用。从第1个学生的已知年龄推算出第2个学生的年龄(12岁),一直推算出第5个学生的年龄18岁为止。如果要求递归过程不是无限制进行下去,必须具有一个结束递归过程的条件。就是要出现已知值,不再调用下去。如:age(1)=10,就是使递归结束的条件,出现已知值,不再调用了,也就终止递归了。编写程序:用一个函数来描述上述递归过程:intage(intn)//求年龄的递归函数,内有调用自身的函数。{intc;if(n==1)c=10∥这里c=age(1),并不等于age(5)elsec=age(n-1)+2;return(c);//c用作存放函数的返回值的变量用一个主函数调用age函数,求得第5个学生的年龄。程序如下:#include<stdio.h>intmain()∥函数名不用分号,因为函变量名与大括号实体内容是一体,不可分离,不用分号,内部也是连接的,不用逗号。{intage(intn);//对age函数的声明,临时变量只用主函数对调用函数变量定义类型非void非任意类型printf("No.5.age:%d\n",age(5));//输出第5个学生的年龄return0;}intage(intn)//自定义递归函数,给调用时创造空间,调用结束时立即释放空间,依靠主函数定义的临时变量存放空间。{intc;if(n==1)c=10;//如果n等于1,年龄为10,控制递归调用进度,当递归函数推进n=1时,停止。else//如果n不等于1//年龄是前一个学生的年龄加2c=age(n-1)+2;return(c);}main函数中age函数共被调用5次,即age(5)、age(4)、age(3)、age(2)、age(1)。其中age(5)是main函数调用的,其余4次是在age函数中调用自己的,即递归调用4次。在某一次调用age函数时并不是立即得到age(n)的确定值,而是一次又一次地进行递归调用,到age(1)时才有确定的值,然后再递推出age(2)、age(3)、age(4)、age(5)。age(1)=10作为递归的终止条件,使递归消失。当n等于2时,应执行“c=age(n-1)+2;”,由于n=2.它相当于“c=age(1)+2;”。注意age(1)的值,此时n=1,应执行“c=10=age(1)”,即不再递归调用age函数了,没有调用自身的函数了,递归调用也就结束。依此类推,可以得到age(5)值为18。用递归方法求n!。求n!可以用递推方法,递推法的特点是从一个已知的事实(如1!=1)出发,按一定规律推出下一个事实(如2!=1!*2),再从这个新的已知的事实出发,再向下推出一个新的事实(3!=3*2!)。n!=n*(n-1)!求n!也可以用递归方法,即5!等于4!*5,而4=3!*4,…1!=1。可用下面的递归公式表示:编写程序:#include<stdio.h>intmain(){intfac(intn);∥fac函数声明intn;inty;printf("inputaintegernumber:");scanf("%d",&n);//这里n可改变,不固定值,将程序变为通用程序,调用参数n任意整数。y=fac(n);调用n变量空间值printf("%d!=%d\n",n,y);//分取提取n值为n!,提取y值,变为y=f(n),执行调用,调用函数具有递归功能。intfac(intn)//自定义调用函数及参变量intf;if(n<0)printf("n<0,dataerror");elseif(n==0n==1)f=1;elsef=fac(n-1)*n;return(f);}每次调用fac函数后,其返回值应返回到调用fac函数处。例如当n=2时,从函数体中可以看到“f=fac(1)*2”,再调用fac(1),返回值为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论