全排列问题的递归算法(回溯算法)
1 //产生元素k~m的全排列,作为前k-1个元素的后缀 2 void Perm(int list[],int k,int m) 3 { 4 //构成了一次全排列,输出结果 5 if(k==m) 6 { 7 for(int i=0; i<=m; i++) 8 cout<<list[i]<<" "; 9 cout<<endl; 10 } 11 else 12 //在数组list中,产生元素k~m的全排列 13 for(int j=k; j<=m; j++) 14 { 15 swap(list[k],list[j]); //swap()是标准库函数,交换两个元素的值。 16 Perm(list,k+1,m); 17 swap(list[k],list[j]); 18 } 19 }
列如:数组 list [] ={1,2,3,4,5,6},则调用Perm(list,0,3)就是产生元素1~4的全排列。
一般情况下,k<m。该算法将list[k:m]中的每一个元素分别与list[k]中的元素交换,然后递归地计算元素list[k+1:m]的全排列,并将计算结果作为list[0:k]的后缀。