首页 > 其他 > 详细

全排列递归算法(不含重复字符)

时间:2014-01-19 08:53:17      阅读:430      评论:0      收藏:0      [点我收藏+]

R={A1,A2,A3...An}是要进行全排列的序列。设集合R的全排列记为P(R),A1 P(R)表示在R的所有全排列之前加上A1 后得到的全排列。

当n=1时,P(R)=(R),此时R中只有一个元素;

当n>1时,P(R)由(A1)P(R1),(A2)P(R2),(A3)P(R3)...(An)P(Rn)组成,其中Ri为R除去Ai的其他元素组成。

n=5时,代码如下:

bubuko.com,布布扣
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 void Perm(char list[],int k,int m);
 6 void Swap(char &a,char &b);
 7 int main()
 8 {
 9     char list[5]={A,B,C,D,E};
10     Perm(list,0,4);
11     return 0;
12 }
13 void Perm(char list[],int k,int m){
14     if(k==m){
15         for(int i=0;i<=m;i++)
16             cout<<list[i];
17         cout<<endl;
18     }
19     else
20         for(int i=k;i<=m;i++){
21             Swap(list[k],list[i]);
22             Perm(list,k+1,m);
23             Swap(list[k],list[i]);
24         }
25 }
26 void Swap(char &a,char &b){
27     int temp=a;
28     a=b;
29     b=temp;
30 }
View Code


可以只用三个元素单步跟踪下程序的运行,就明白了逐步递归的过程。

P(ABC)={A P(BC),B P(AC),C P(AB)}

           ={A B P(C),A C P(B);B A P(C),B C P(A);C A P(B),C B P(A)}

     ={ABC,ACB;BAC,BCA;CAB,CBA}

 

代码中

1
2
3
4
5
for(int i=k;i<=m;i++){
    Swap(list[k],list[i]);
    Perm(list,k+1,m);
    Swap(list[k],list[i]);
}

 两次交换就是在输出一个递归分支之后将原序列还原,保持原序列不变,类似的处理下一个递归分支。

 

 

来源:http://blog.163.com/blue_boy29/blog/static/76212945200971093732817/

全排列递归算法(不含重复字符)

原文:http://www.cnblogs.com/fool-duck/p/3525681.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!