一. 定义
直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。
由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。
分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。
二. 具体问题分析
- 排列问题
问题描述:设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。
问题解决:设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。集合X中元素的全排列记为perm(X)。perm(X)(ri)表示在全排列perm(X)的每一个排列后加上后缀得到的排列。我们可以发现,R的全排列可以由以下的算法得到:依次将R中的一个元素换到最后的位置,并求出剩余元素的全排列。这样我们把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,那么R的全排列可归纳定义如下 :
当n=1时,perm(R)为它本身;
当n>1时,perm(R)由perm(R1)(r1)、perm(R2)(r2)。。。perm(Rn)(rn)组成。
#include <iostream>
#include <vector>
using namespace std;
vector< vector<int> > res;
void perm(vector<int> num,int n)
{
if(n==1)
{
res.push_back(num);
return;
}