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