求全排列问题:如 123 共有 3*2*1 = 6 种组合。 以下程序先是通过递归方式打印出组合。之后再通过非递归与递归(注释了)方式求得了组合数的多少,即n! /** *递归算法的设计要点: 1.写出递归表达式,一般是一个n=1的分段函数 2.函数的值的传递,会记录n-1 */ //题目描述如下: //集合X的全排列记为:Perm(X),riPerm(X) 表示在每一个Perm(X)排列前加上前缀ri //得到的排列 //全排列记为:Perm(R) 由 (r1)Perm(R1),...,(rn)Perm(Rn)组成 #include <iostream> using namespace std; template<typename T> void print_list(T list[],int k) { cout<<"/nlist:"; for(int i=0;i<k;i++) { cout<<list[i]<<" "; } } /* *思想:产生所有前缀是list[0,k-1]和后缀是list[k,n]的全排列 */ template<typename T> void Perm(T list[],int k,int m) { //产生k,m的所有排列 if(k==m) { //只剩下一个元素 print_list(list,m); } else { //此时前缀是list[0,k-1] //将list[k->m]中的每一个元素分别与list[k]中的元素交换, //递归得到list[k+1 -> m]的全排列 for(int i=k;i<=m;i++) { swap(list[k],list[i]); Perm(list,k+1,m); swap(list[k],list[i]); } } }; template<typename T> inline void swap(T &m,T &n) { T temp = m; m = n; n = temp; }; int getFactorial(int n) { int result=1; for(int i=1;i<=n;i++) { result*=i; } return result; //************* recusive algorithem **************** /* if(n==0) return 1; else return n*getFactorail(n-1); */ } int main() { int list[]={7,1,5}; int length = sizeof(list)/sizeof(list[0]); print_list(list,length); Perm(list,0,length-1); cout<<"unrecusive------------------------"<<endl; int n=3; cout<<"/nn"<<" factorial:"<<getFactorial(n)<<endl; return 1; }