c语言函数递归调用

c语言函数递归调用函数的递归调用在调用一个函数的过程中又出现直接或间接地调用该函数本身,这种用法称为函数的递归调用。

欢迎大家来到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。

c语言函数递归调用

c语言

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/77847.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信