递归与分治【待续】

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

    原文作者:递归与分治算法
    原文地址: https://blog.csdn.net/sunshine_critical/article/details/79689142
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞