以下代码用于求一组字母的排列和组合,
思路:求组合时,采用递归的思路,当求数组的n个元素的组合时,首先将数组分为两部分,第一个元素和其余元素,当第一个元素在生成的组合中时,则在其余元素中求n-1的组合;当第一个元素不再生成的组合中时,则在其余元素中求n的组合。主函数用于调用上面描述的递归函数,用一个循环生成1到数组长度的所有组合,具体功能由子函数实现并打印出来。
求排列时:也是采用递归思路,把一个字符串看成由两部分组成:第一部分是它的第一个字符,第二部分是后面所有的字符。在求整个字符串的排列可以看成这两步:首先求所有可能出现在第一个位置的字符,即把第一个字符和后面的所有字符依次交换。然后再递归的求后面所有字符的排列。
#include <iterator>
#define num 6
void permutiation(vector<char>::iterator vchar_iter,vector<char>::iterator vchar_iter_begin,vector<char>::iterator vchar_iter_end)
{
if(vchar_iter_begin == vchar_iter_end){
ostream_iterator<char> outer(cout," ");
copy(vchar_iter,vchar_iter_end,outer);
cout << endl;
}
else{
vector<char>::iterator vchar_iter2 = vchar_iter_begin;
while(vchar_iter_begin != vchar_iter_end){
char temp = *vchar_iter_begin;
*vchar_iter_begin = *(vchar_iter2);
*vchar_iter2 =temp;
vchar_iter_begin++;
//vchar_iter ++;
permutiation(vchar_iter,vchar_iter2+1,vchar_iter_end);
temp = *(vchar_iter_begin -1);
*(vchar_iter_begin -1) = *(vchar_iter2);
*vchar_iter2 =temp;
}
}
}
static vector<char> result;
void get_combination(vector<char>::iterator vchar_iter,vector<char>::iterator vchar_iter_end,int n);
void get_combination (vector<char>::iterator vchar_iter,vector<char>::iterator vchar_iter_end,int n,bool print){
for(int i = 0;i<n;i++){
//result.push_back(*vchar_iter);vchar_iter++;
get_combination(vchar_iter,vchar_iter_end,i+1);
//vchar_iter--;
//result.pop_back();
//get_combination(vchar_iter,vchar_iter_end,n-i);
//vchar_iter--;
//get_combination(vchar_iter++,vchar_iter_end,n-i,false);
}
}
void get_combination(vector<char>::iterator vchar_iter,vector<char>::iterator vchar_iter_end,int n){
if(vchar_iter==vchar_iter_end&&n!=0)
return;
if(n==0){
ostream_iterator<char> outer(cout," ");
copy(result.begin(),result.end(),outer);
cout << endl;
return;
}
/*if(n==vchar_iter_end-vchar_iter){
result.insert(result.end(),vchar_iter,vchar_iter_end);
ostream_iterator<char> outer(cout," ");
copy(result.begin(),result.end(),outer);
cout << endl;
return;
}*/
//for(int i = 0;i<n&&vchar_iter < vchar_iter_end;i++)
{
result.push_back(*vchar_iter);vchar_iter++;
get_combination(vchar_iter,vchar_iter_end,n-1);
//vchar_iter--;
result.pop_back();
get_combination(vchar_iter,vchar_iter_end,n);
//vchar_iter--;
//get_combination(vchar_iter++,vchar_iter_end,n-i,false);
}
}
int main(){
vector<char> vchar;
for(int i=0;i<num;i++){
vchar.push_back('a'+i);
}
//permutiation(vchar.begin(),vchar.begin(),vchar.end());
get_combination(vchar.begin(),vchar.end(),num,true);
}
收获:在求组合的代码中,用到了两个函数,主函数用于调用子函数进而生成各种不同数目的组合,而子函数则完成生成特定数目的组合的生成和打印。这里注意递归截至条件的使用。在已经到达结尾,而仍旧不能产生有效的输出时直接return。
在求排列的代码中,采用