排列是练习递归的简单的算法,因此练习一下。
输入一组数,比如 1,2,3,4,5,6,7,求 取3个元素的排列
设计的函数应该是
输入:
列表 vec
取元素的个数 n
输出 :
元素的所有可能的排列
开始取元素吧
第一次可能取 1 2 3 4 5 6 7
如果取了1 ,那么可以取 2 3 4 5 6 7
如果取了2 ,那么可以取 3 4 5 6 7
...
这是一个树形结构
可以使用递归求解
递归函数:
输入:上次产生的结果,输入的列表,取元素个数
一层循环然后将结果迭代到下次函数的调用。
函数原型:
void pailie1(vector<int> &preVec,vector<int> &vec,int n)
代码如下:
// pailie.cpp : Defines the entry point for the console application.
//
#include <tchar.h>
#include <vector>
#include <iostream>
using namespace std;
void pailie1(vector<int> &preVec,vector<int> &vec,int n);
void print_vector(vector<int> &vec)
{
cout <<"[";
for(int i=0;i<vec.size();i++)
{
cout << vec[i] << " ";
}
cout << "]" << endl;
}
//pailie(vector<int> &preVec,vector<int> &vec,int n)
//输出一组数的排列P(N,m)
//vec - 输入数组
//n - 取几个数的排列
//
void pailie(vector<int> &vec,int n)
{
vector<int> preVec;
pailie1(preVec,vec,n);
}
//preVec - 前缀数组
//vec - 输入数据
//n - 排列几个元素
//
void pailie1(vector<int> &preVec,vector<int> &vec,int n)
{
if(n==0){
print_vector(preVec);
return;
}
for(int i = 0;i<vec.size();i++)
{
vector<int> v = vec;
v.erase(v.begin()+i);
vector<int> prevec1 = preVec;
prevec1.push_back(vec[i]);
pailie1(prevec1,v,n-1);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int buf[] = {1,2,3,4,5,6,7};
vector<int> vec(buf,buf+sizeof(buf)/sizeof(buf[0]));
pailie(vec,1);
pailie(vec,4);
pailie(vec,sizeof(buf)/sizeof(buf[0]));
return 0;
}