1,递归与分治的概念
直接或者间接调用自身的算法成为递归算法,用函数自身给出定义的函数称为递归函数。
分治法的设计思想是:把一个难以解决的大问题,分割成多个规模较小的相同问题,以便各个击破,分而治之。其中子问题不可以重叠,否则一般使用动态规划的思想。 分治主要步骤为:分割(常使用均分(n/2)或者偏分(n-1)的思想),递归架构,合并。
2,部分实例
【递归】 1,排列问题
若将数组P中的n个元素进行全排列,数组P中元素的全排列记做R(p),则r1·R(p)即在全排列R(p)前面加上元素r。
则将其归纳为:
当n=1时,P = {r},即r是P中唯一的元素,R(p) = r;
当n>1时,R(p) = r1·R(p1) + r2·R(p2) + ……+rn·R(pn)
以此可设计递归算法如下
//排列问题
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
template<class Type>
void Perm(Type l[],int k, int m)//一共m个字符
{
if(k == m)//如果坐标移动到最后一个字符,则输出
{
for(int i = 1; i <= m; i ++)
{
cout << l[i];
}
cout <<endl;
}
else
{
for(int i = k; i <= m; i ++)
{
swap(l[i],l[k]);//将第i个字符与第k个交换
Perm(l,k+1, m);//向下递归
swap(l[i],l[k]);//交换回来
}
}
}
int main()//以数组a【5】的后四个数字的全排列为例
{
int a[5] = {0,1,2,3,4};
Perm(a,1,4);
return 0;
}