算法设计时候,递归技巧可以很方便地解决一些复杂的问题。
求一串数字的全排列就可以用递归技巧写出程序。
例如,
[1,2,3] 有下列排列:
[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], 和 [3,2,1].
递归过程:
1,为了求[1,2,3]的全排列,可以先求子串[2,3]的全排列,最后将1加到结果中即可
2,求所有子串的全排列,即去掉2求子串[1,3],去掉3求子串[1,2]。
eg:
1开头:字串全排列[2,3],[3,2],得到[1,2,3],[1,3,2]
2开头:子串全排列[1,3],[3,1],得到[2,1,3],[2,3,1]
3开头:子串全排列[1,2],[2,1],得到[3,1,2],[3,2,1]
下面是测试程序:
/**
*输出全排列
*[1,2,3]有一下全排列
* [1,2,3],[1,3,2][2,1,3][2,3,1],[3,2,1],[3,1,2]
*
* */
/**
*使用递归
* */
#include <iostream>
#include <vector>
using namespace std;
class permutations
{
public:
permutations() {}
vector<vector<int>> permute(vector<int> &num);
};
vector<vector<int>> permutations::permute(vector<int> &num)
{
vector<vector<int>> res;
// 递归结束条件,给定的一串数字num只有一个数字,则放入num中并返回结果
if(num.size()==0)
{
res.push_back(num);
return res;
}
// 当字符串长度>1,递归调用
for(unsigned int i=0;i<num.size();i++)
{
// 依次次提取数字串中的一个数字,得到剩余数字串
vector<int> subnum(num.begin(),num.end());
subnum.erase(num.begin()+i);
// 求剩余数字串的全排列
vector<vector<int>> subres;
subres=permute(subnum);
// 将剩余数字串的全排列结果每个排列上都添回num[i]
for(unsigned int j=0;j<subres.size();j++)
{
subres[j].insert(subres[j].begin(),num[i]);
res.push_back(subres[j]);
}
}
return res;
}
ostream &operator <<(ostream &o,vector<int> &v)
{
for(auto e:v)
{
o<<e<<" ";
}
return o;
}
int main()
{
vector<int> test_vector{1,2,3};
// 输出test_vector
cout<<test_vector;
permutations p;
vector<vector<int>> res;
res=p.permute(test_vector);
// output res
for(unsigned int i=0;i<res.size();i++)
{
for(unsigned int j=0;j<res[i].size();j++)
{
cout<<res[i][j]<<" ";
}
cout<<endl;
}
cout << "Hello World!" << endl;
return 0;
}