递归与分治【待续】

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值