### 函数递归调用

函数递归是指函数直接或间接调用其本身。递归的直接调用是指在函数体中再次调用该函数。递归的间接调用是指，函数调用另一个函数，而被调用函数有调用了第一个函数。在编写程序时，使用递归可以简化问题的求解方法。

例如，下面的代码利用递归求 n 的阶乘。其程序代码如下：

typedef unsigned int UINT; //自定义类型

int factorial(const UINT n) //定义递归函数

{

if (n == 0 || n == 1) //递归结束套件

return 1;

else

{

return n * factorial(n-1); //直接调用本身

}

}

在上述代码中，factorial 函数实现了计算 n 的阶乘。以 n 等于 4 为例，4!等于 4*3!，3!等于 3*2!…，1!等于 1。当计算 4 的阶乘时，只要知道 3 的阶乘就可以了，4*3!等于 4!。同理，计算 3 的阶乘，只要知道 2 的阶乘就可以了，依此类推。1 的阶乘为 1，知道了 1 的阶乘，就可以计算 2 的阶乘，知道 2 的阶乘就可以计算 3 的阶乘…。

说明：对于递归函数来说，必须具有终止条件，无限制的递归将导致程序崩溃。对于上述factorial函数来说，递归的终止条件是n等于1或等于0。

递归函数会增加系统的额外开销，导致程序性能下降，因此，开发程序时尽量避免使用递归。在上面的递归函数中，如果传递一个很大的数，会导致堆栈溢出，因为每调用一个函数，系统会为函数的参数分配堆栈空间。对于上述的递归函数 factorial 完全可以用连续乘积的方式实现。

例如，利用循环求 n 的阶乘

typedef unsigned int UINT; //自定义类型

long factorial(const UINT n) //定义函数

{

long ret = 1; //定义结果变量

for(int i=1; i<=n; i++) //累计乘积

{

ret *= i;

}

return ret; //返回结果

}