排列组合的递归

来源:互联网 发布:网络招商平台 编辑:程序博客网 时间:2024/05/21 16:08

令E={e1,e2,…,en}表示n个元素的集合,;Ei为E中移去元素ei后的集合,perm(X)表示集合X中元素的排列方式。Ei*perm(X)表示在集合X的每个排列方式的前面都加上ei后所得的排列方式。

    则集合E的排列组合等于:

    n= 1;perm(E) = {e1};

    n> 1;perm(E) = e1*perm(E1)+e2*perm(E2)+……+en*perm(En);

#include<iostream>#include<vector>#include<iterator>#include<algorithm>using namespace std;/*求n个元素的排列组合*n = 1;perm(E) = {e1};*n > 1;perm(E) = e1*perm(E1)+e2*perm(E2)+……+en*perm(En);*/void fun(vector<int> & vec,vector<int>::iterator iter) {if(iter+1 == vec.end()){copy(vec.begin(),vec.end(),ostream_iterator<int>(cout," "));cout<<endl;return;}for (vector<int>::iterator it = iter; it< vec.end(); it++){swap_ranges(it,it+1,iter);fun(vec,iter+1);swap_ranges(it,it+1,iter);}}int main(){vector<int> vec;copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(vec));fun(vec,vec.begin());}/*输入和运算结果:1 2 3 4^Z1 2 3 41 2 4 31 3 2 41 3 4 21 4 3 21 4 2 32 1 3 42 1 4 32 3 1 42 3 4 12 4 3 12 4 1 33 2 1 43 2 4 13 1 2 43 1 4 23 4 1 23 4 2 14 2 3 14 2 1 34 3 2 14 3 1 24 1 3 24 1 2 3请按任意键继续. . .*/


1 4
原创粉丝点击