程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 算法筆記之 全排列算法 一 遞歸求解

算法筆記之 全排列算法 一 遞歸求解

編輯:C++入門知識

集合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}……………………………… ………… 直到集合裡只有一個元素,就可直接輸出了.   [cpp]   #include <iostream>      using namespace std;      //char * str;   //int len = 2;      /**   *產生list[start:end]的所有排列, 通常為0,len-1   */   template <class Type>   void Perm(Type list[],int start,int end){          //單元素序列       if( start == end){ //即此時集合裡只有一個元素           for(int i=0; i<=end; i++)               cout << list[i];           cout << endl;       }          //多元素序列,遞歸產生排列       else{           for(int i= start; i<= end; i++){               Swap(list[start], list[i]);//交換可得:1,{2,3,4} ; 2,{1,3,4};  3,{1,2,4}; 4,{1,2,3}                              Perm(list, start+1, end);               Swap(list[start], list[i]);//輸出排列之後,要再交換回到初始狀態:{1,2,3,4}                             }       }      }         template <class Type>   inline void Swap(Type &a, Type &b){       Type temp = a;       a = b;       b = temp;   }            int main() {       char str[] = "abcd";       Perm(str, 0,3);          //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!       return 0;   }       輸出: abcd abdc acbd acdb adcb adbc bacd badc bcad bcda bdca bdac cbad cbda cabd cadb cdab cdba dbca dbac dcba dcab dacb dabc    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved