全排列算法递归实现 C++
2012-09-27 17:21
465 查看
尝试编写算法经典问题,全排列..目的只在练手
算法简介:
设A是对集合S的求其全排列序列的运算(例A{a}={a},A{a,b}={ab,ba}...),则A对集合的运算可展开成如下递归式:
A{a1,a2,...,an}={{a1}A{a2,a3,...,an}+{a2}A{a1,a3,...,an}+...+{an}A{a1,a2,...,an-1}}
以包含五个元素的集合{a1,a2,a3,a4,a5}为例:
A{a1,a2,a3,a4,a5}={{a1}A{a2,a3,a4,a5}+{a2}A{a1,a3,a4,a5}+{a3}A{a1,a2,a4,a5}+
{a4}A{a1,a2,a3,a5}+{a5}A{a1,a2,a3,a4}}
(其中+运算可理解为集合的并,例如{a,b}+{c}={a,b,c};乘运算可理解为内积运算,例如{a}{b,c}={ab,ac})
故根据以上原理编写递归全排列算法
算法简介:
设A是对集合S的求其全排列序列的运算(例A{a}={a},A{a,b}={ab,ba}...),则A对集合的运算可展开成如下递归式:
A{a1,a2,...,an}={{a1}A{a2,a3,...,an}+{a2}A{a1,a3,...,an}+...+{an}A{a1,a2,...,an-1}}
以包含五个元素的集合{a1,a2,a3,a4,a5}为例:
A{a1,a2,a3,a4,a5}={{a1}A{a2,a3,a4,a5}+{a2}A{a1,a3,a4,a5}+{a3}A{a1,a2,a4,a5}+
{a4}A{a1,a2,a3,a5}+{a5}A{a1,a2,a3,a4}}
(其中+运算可理解为集合的并,例如{a,b}+{c}={a,b,c};乘运算可理解为内积运算,例如{a}{b,c}={ab,ac})
故根据以上原理编写递归全排列算法
#include<iostream> #include<list> usingnamespacestd; voidpermutation(strings,stringout,list<string>&sequence); intmain() { strings; cin>>s;//输入待排列字符串 intn=s.size();if(n==0)return0; list<string>sequence;//保存全排列序列 stringout; permutation(s,out,sequence); cout<<"------------------------"<<endl; for(list<string>::iteratorit=sequence.begin();it!=sequence.end();it++) { cout<<*it<<endl; } return0; } voidpermutation(strings,stringout,list<string>&sequence) { if(s.size()==1)//递归在序列长度为1时跳出 { sequence.push_back(out+s); return; } stringnewStr;//存储待排列的子集合 for(inti=0;i<s.size();i++) { if(i==0) { stringstr(s,1,s.size()-1); newStr=str; } elseif(i==(s.size()-1)) { stringstr(s,0,s.size()-1); newStr=str; } else { stringstr1(s,0,i); stringstr2(s,i+1,s.size()-i-1); newStr=str1+str2; } stringstrx(s,i,1); out.append(strx);//存储排列序列 permutation(newStr,out,sequence);//递归调用 string::iteratorit=out.end()-1; out.erase(it);//清除序列最后一个元素 } }
//-------------------------------procrustes---------2012.9.27
相关文章推荐
- 全排列算法的非递归实现与递归实现的方法(C++)
- 二叉树的遍历 递归 非递归 C++ 实现
- 霍尔快速排序 非递归 C++实现
- 20170219C++项目班02_02递归下降算法/解析器/Scanner实现
- (以实现)c++非递归层次二叉树
- C++ 递归和非递归实现链表逆序
- C++ 二叉树遍历(三种遍历的递归实现)
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 全排列算法的递归与非递归实现
- C++ 快速排序 递归实现
- 霍尔快速排序 非递归 C++实现
- 20170219C++项目班02_02递归下降算法/解析器/Scanner实现
- C++-----利用括号递归实现的加减乘除
- C++ 中快排的递归和非递归实现
- C++递归与非递归实现链表的反转
- 求 1!+2!+3!....+n! 的 C++递归与非递归实现
- 用递归实现求和,求最大最小值,C++
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 算法:C++实现二叉树遍历(递归、非递归)
- 二叉树遍历(前中后序递归、非递归遍历,层次遍历,C++实现)