c语言--函数的递归调用 ppt课件
- 格式:ppt
- 大小:778.00 KB
- 文档页数:16
121 return s; }/*函数名:fac*//*形参:n,int 型*//*返回值:long 型*//*功能:求n!的值*/ long fac(int n) { int i; long t=1;for(i=1;i<=n;i++) t=t*i; return t; }程序运行结果如图5-16所示。
程序分析:在该程序中定义了两个函数,sum 函数用来求1!+2!+…+n!的值,fac 函数用来求n!的值。
由于sum 函数的累加通项为i !,所以sum 函数中对fac 函数进行了调用。
这里要注意一点,虽然sum 函数和fac 函数的形参都是n ,但它们是不相干的,函数的形参变量只在本函数内有效,离开了本函数,形参变量也就消失了。
在主程序mian 中,调用了sum(x)求分子,sum(y)求分母,由于sum 函数返回值是long 型,因此表达式sum(x)/sum(y)的值也为long 型,这可能导致结果不正确,因此这里需要把分子或分母强制转换类型成float 型。
5.5.2 函数的递归调用一个函数在程序运行的过程中,直接或间接地调用自己称为递归调用。
C语言允许函数的递归调用,递归调用示意图如图5-17所示。
图5-17 递归调用示意图执行递归函数将反复调用该函数自身,每调用一次就进入新的一层,因此递归函数一定要有控制终止递归调用的语句。
没有控制的递归是毫无意义的,例如:void p() { printf("****");p(); }是一个递归函数,但是该函数将无休止地调用其本身,是一个死循环。
很明显,这种不会终止递归的程序是不正确的。
为了防止递归无终止地进行,常用的办法是在递归中加入条件判断,满足某种条件后就不再作递归调用,然后逐层返回。
下面我们来看一个递归调用的例子。
【例5.9】 用递归法计算n!。
n!可以表示为:图5-16 例5.8程序运行结果。