首页 理论教育递归函数,求解阶乘,递归调用,数学函数

递归函数,求解阶乘,递归调用,数学函数

【摘要】:在某些问题中,可以用调用函数自身的方式来解决问题。在一个函数中直接或间接地调用该函数自身的方式称做函数的递归调用。递归的概念在我们的自然生活中并不陌生。讲的故事又是其自身,这就相当于递归。这也是递归的例子。在数学中,更是有许多函数采用递归的定义形式。=3628800函数fact()包含了对其自身的调用,因此fact()是一个递归函数。来看一看这个递归函数的执行过程。图5.6递归求解3!

至今为止,我们所用到的函数调用都是用一个函数调用另一个函数。在某些问题中,可以用调用函数自身的方式来解决问题。在一个函数中直接或间接地调用该函数自身的方式称做函数的递归调用。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!