定义:程序直接或间接调用自身的编程技巧称为递归算法(Recursion)。
递归算法的优点:
一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归算法的使用:
递归需要有边界条件、递归前进段和递归返回段
。
当
边界条件不满足时,递归前进;
当
边界条件满足时,递归返回。
注意
:在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口,否则将无限进行下去(死锁)。
递归算法的缺点:
递归算法解题的运行效率较低。
在递归调用过程中,系统为每一层的返回点、局部变量等开辟了堆栈来存储。递归次数过多容易·造成堆栈溢出等问题。
递归算法示例:
集合的全排列问题:
给定一个集合,求出该集合的任意从k~m的全排列(k,m小于等于集合元素数)
算法分析:
当只有一个元素时,全排列就是这个元素本身;
当有大于一个元素时,可以依次从中拿出一个元素x作为排列的首元素,排列出以x为首元素的全部排列结果,再将这些结果合并即可得到全排列结果。
void Perm(int list[], int k, int m)
{
if(k==m) //构成了一次全排列,输出结果
{
for(int i=0;i<=m;i++)
cout<<list[i]<<" ";
cout<<endl;
}
else
//在数组list中,产生从元素k~m的全排列
for(int j=k;j<=m;j++)
{
swap(list[k],list[j]);
Perm(list,k+1,m);
swap(list[k],list[j]);
}
}