算法笔记之 全排列算法 一 递归求解

来源:互联网 发布:淘宝店铺头像在哪里换 编辑:程序博客网 时间:2024/05/01 20:48

http://blog.csdn.net/gladyoucame/article/details/8637745


集合R={1,2,3,4}的全排列

可以分解为:1,{2,3,4}的全排列 + 2,{1,3,4}的全排列 + 3,{1,2,4}的全排列 + 4,{1,2,3}的全排列。

继续分解:{2,3,4} 为 2,{3,4}的全排列,3,{2,4},  4,{2,3}………………………………

…………

直到集合里只有一个元素,就可直接输出了.


这个是非递归的方法:http://blog.csdn.net/gaotong2055/article/details/8646290

[cpp] view plaincopy
  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. //char * str;  
  6. //int len = 2;  
  7.   
  8. /** 
  9.  *产生list[start:end]的所有排列, 通常为0,len-1 
  10.  */  
  11. template <class Type>  
  12. void Perm(Type list[],int start,int end){  
  13.   
  14.     //单元素序列  
  15.     if( start == end){ //即此时集合里只有一个元素  
  16.         for(int i=0; i<=end; i++)  
  17.             cout << list[i];  
  18.         cout << endl;  
  19.     }  
  20.   
  21.     //多元素序列,递归产生排列  
  22.     else{  
  23.         for(int i= start; i<= end; i++){  
  24.             Swap(list[start], list[i]);//交换可得:1,{2,3,4} ; 2,{1,3,4};  3,{1,2,4}; 4,{1,2,3}  
  25.               
  26.             Perm(list, start+1, end);  
  27.             Swap(list[start], list[i]);//输出排列之后,要再交换回到初始状态:{1,2,3,4}  
  28.               
  29.   
  30.         }  
  31.     }  
  32.   
  33. }  
  34.   
  35.   
  36. template <class Type>  
  37. inline void Swap(Type &a, Type &b){  
  38.     Type temp = a;  
  39.     a = b;  
  40.     b = temp;  
  41. }  
  42.   
  43.   
  44.   
  45. int main() {  
  46.     char str[] = "abcd";  
  47.     Perm(str, 0,3);  
  48.   
  49.     //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!  
  50.     return 0;  
  51. }  


输出:

abcd
abdc
acbd
acdb
adcb
adbc
bacd
badc
bcad
bcda
bdca
bdac
cbad
cbda
cabd
cadb
cdab
cdba
dbca
dbac
dcba
dcab
dacb
dabc



0 0
原创粉丝点击