**递归算法**
定义:就是直接或间接调用自身的算法。
实现的原理:每次递归调用后必须越来越接近某种限制条件,当递归算法符合这个限制条件,他便不再调用自身。
让我们来用阶乘举例来简单说明一下递归算法:
阶乘的递归算法
int Factorial(int n)
{
if(n < 1) //限制条件
return 1;
else
return n * Factorial(n - 1); //递归调用
}
阶乘的递归调用的是函数所执行的最后一步,这个函数是尾部递归的一个例子,由于函数在递归调用返回之后不再执行任何任务,所以尾部递归很方便的转换成一个简单的循环。
阶乘的非递归算法 : 循环
int UnFactorial(int n)
{
int sum = 1;
for(int i = n; i > 1; --i)
{
sum *= i;
}
return sum;
}
递归虽然有简洁的优点,但它同时也有显著的缺点。递归由于是函数调用自身,而函数调用是有时间和空间的消耗的,每一次函数调用,都需要在内存栈中分配空间以保存参数,返回地址及临时变量,而且往栈里压入数据和传出数据都需要时间的,这就不难理解阶乘递归实现的效率不如循环。