欢迎大家来到IT世界,在知识的湖畔探索吧!
函数的递归调用
在调用一个函数的过程中又出现直接或间接地调用该函数本身,这种用法称为函数的递归调用。
例如:
int f ( int x )
{int x,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,就是使递归结束的条件,出现已知值,不再调用了,也就终止递归了。
编写程序:用一个函数来描述上述递归过程:
int age ( int n )
//求年龄的递归函数,内有调用自身的函数。
{int c;
if ( n ==1) c=10
∥这里c=age(1),并不等于age(5)
else
c=age (n-1)+2;
return(c );
// c 用作存放函数的返回值的变量
用一个主函数调用 age 函数,求得第5个学生的年龄。
程序如下:
# include < stdio.h>
int main () ∥函数名不用分号,因为函变量名与大括号实体内容是一体,不可分离,不用分号,内部也是连接的,不用逗号。
{int age ( int n ); //对 age 函数的声明,临时变量只用主函数对调用函数变量定义类型非void非任意类型
printf (” No.5.age:% d \n”, age (5));
//输出第5个学生的年龄
return 0;}
int age ( int n ) //自定义递归函数,给调用时创造空间,调用结束时立即释放空间,依靠主函数定义的临时变量存放空间。
{ int c; if ( n ==1) c=10;
//如果 n 等于1,年龄为10,控制递归调用进度,当递归函数推进n=1时,停止。
else
//如果 n 不等于1
//年龄是前一个学生的年龄加2
c=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 >
int main ()
{ int fac ( int n );
∥fac函数声明
int n;int y;
printf (” input a integer number:” ) ;
scanf (” %d”,&n);//这里n可改变,不固定值,将程序变为通用程序,调用参数n任意整数。
y = fac( n );调用n变量空间值
printf (” %d!=%d\n”, n,y );//分取提取n值为n!,提取y值,变为y=f(n),执行调用,调用函数具有递归功能。
int fac(int n ) //自定义调用函数及参变量
int f;
if(n<0)
printf (” n <0,data error “);
else if (n==0 n ==1)
f=1;
else f=fac(n-1)*n;
return(f);}
每次调用 fac 函数后,其返回值应返回到调用 fac 函数处。例如当 n =2时,从函数体中可以看到“ f = fac (1)*2”,再调用 fac (1),返回值为1。这个1就取代了“ f = fac (1)x2”中的 fac (1).从而f=fac(2)=2。递归终止条件为 n =0或n=1。到n=2时能求出f(1),为什么还出现n=0,因为当调用f(1)直接等于1,n<0时还包括n=0,直接调用f(0)等于1。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/77847.html