一个函数直接或间接地调用自己,称为函数的递归调用。所以函数递归调用的实现必须依靠系统提供一个特殊部件(堆栈)存放未完成的操作,以保证当递归调用结束回溯时不会丢失任何应该执行而没有执行的操作。为了理解函数递归调用的特性,参照例5.9的程序讨论函数递归调用的执行过程,为了讨论方便为程序加上行号。函数递归调用示例。......
2023-11-20
至今为止,我们所用到的函数调用都是用一个函数调用另一个函数。在某些问题中,可以用调用函数自身的方式来解决问题。在一个函数中直接或间接地调用该函数自身的方式称做函数的递归调用。C语言支持函数的递归调用。
递归的概念在我们的自然生活中并不陌生。在我们小的时候大多都听过这样一个古老而有趣的故事:从前有座山,山里有座庙,庙里有个老和尚在讲故事,讲的是:从前有座山,山里有座庙……讲的故事又是其自身,这就相当于递归。你也许还见过这样一种杂志的封面,封面上面有个模特,模特手里又拿着这本杂志本身,当然拿着的杂志的封面又是这个模特……这也是递归的例子。在数学中,更是有许多函数采用递归的定义形式。例如,我们可能见到过的fibonacci(斐波那契)数列。
例5.14 求阶乘。
运行结果
0!=1
1!=1
2!=2
3!=6
4!=24
5!=120
6!=720
7!=6040
8!=40320
9!=362880
10!=3628800
函数fact()包含了对其自身的调用,因此fact()是一个递归函数。现在让我们通过求3!来看一看这个递归函数的执行过程。
由于3≠0,所以执行else后面的语句
result=n*fact(n-1);
也就是
result=3*fact(2);
这里再次调用了fact()函数,参数值为2,由于2≠0,所以执行
result=2*fact(1);
还是要调用fact()函数,这时参数值为1,由于1≠0,继续执行else后面的语句
result=1*fact(0);(www.chuimin.cn)
这次调用fact()时,参数值为0,所以执行
result=1;
然后将result的值返回调用处,这样上一次的调用语句
result=1*fact(0);
就变成了
result=1*1;
计算出result值后,将其值(也就是fact(1)的值)返回到调用处,于是
result=2*fact(1);
成为
result=2*1;
将其值做为fact(2)的值返回到调用处,
result=3*fact(2);
变为
result=3*2;
这样最终得到了fact(3)的值6,并将其返回主函数main()中输出。
归纳起来,fact(3)的求值过程相当于
fact(3)=3*fact(2)
=3*2*fact(1)
=3*2*1*fact(0)
=3*2*1*1
=6
fact(3)求解时的函数调用情况如图5.6所示。
图5.6 递归求解3!
有关C语言程序设计 第2版的文章
一个函数直接或间接地调用自己,称为函数的递归调用。所以函数递归调用的实现必须依靠系统提供一个特殊部件(堆栈)存放未完成的操作,以保证当递归调用结束回溯时不会丢失任何应该执行而没有执行的操作。为了理解函数递归调用的特性,参照例5.9的程序讨论函数递归调用的执行过程,为了讨论方便为程序加上行号。函数递归调用示例。......
2023-11-20
递归函数是指一个函数在它的函数体内,直接或间接地调用自己,也称为函数的递归调用。为了防止递归调用无终止地进行,在函数内必须有终止递归调用的手段。递归算法就是包含有调用算法本身语句的算法。而递归必须逐步有规律简化,最终有一个出口。应有使递归结束的条件。有5 个学生坐在一起。图5.13递归函数的执行过程用函数递归方法以字符串形式输出一个整数。......
2023-10-21
在C语言中,以函数首部声明函数的形式称为函数原型。使用函数原型是C语言的一个重要特征,主要作用是利用它在程序的编译阶段对调用函数的合法性进行全面检查。......
2023-11-18
所谓函数的调用就是在一个函数体中引用另外一个已经定义了的函数,前者称为主调用函数,后者称为被调用函数。实际参数的作用是将它的值传递给被调用函数中的形式参数。2)函数表达式。这种在调用一个函数的过程中又调用了另一个函数的方式,称为嵌套函数调用,在输出一个函数的值时经常采用这种方法。例如:其中,函数funtion1(i,j)是作为printf()函数的一个实际参数处理的,它也属于嵌套函数调用方式。......
2023-11-17
1)参数方程确定的函数的导数有时函数由参数方程来表示更方便且简单,如π)表示以R为半径、原点为圆心的上半圆周曲线.星形线的直角坐标方程为其参数方程为显然星形线的参数方程更为简单.一般地,设参数方程若t∈(α,β)时,x=x(t),y=y(t)都有连续的导数,且x′(t)≠0,可以证明x=x(t)必有单值反函数t=t(x),代入y=y(t)中,得y=y[t(x)],因此在所给条件下,参数方程确定了y......
2023-11-19
C51中,与使用变量一样,在调用一个函数之前,必须对该函数的类型进行说明,即“先说明,后调用”。如果调用的是用户自定义函数,而且该函数与调用它的主调函数在同一文件中,一般应该在主调用函数中对被调用函数的类型进行说明。需要注意的是,函数的说明与函数返回值的定义是完全不同的。但是允许在调用一个函数的过程中包含另一个函数调用,即嵌套函数调用在C语言程序中是允许的。......
2023-11-17
【主要内容】计算函数的导数的基础是求导基本公式和四则运算法则.求导基本公式:(1)C′=0(C是常数),(2)(xμ)′=μxμ-1,(3)(ax)′=axlna(常数a>0但a≠1),特别地,(ex)′=ex,(4),特别地,,(5)(sinx)′=cosx, (6)(cosx)′=-sinx,(7)(tanx)′=sec2x, (8)(cotx)′=-csc2x,(9)(secx)′=secx......
2023-10-27
如果是极点,指出它的级.解 令ζ = 则由于g(ζ)在ζ = 0解析且g 0,所以ζ = 0是的简单极点,因此z = ∞是f 的简单极点.......
2023-10-30
相关推荐