全排列遞迴演算法(C++實現)
阿新 • • 發佈:2019-02-11
演算法實現思路
遞迴解決問題的方法就是將一個大問題不斷分解成小問題,直到小問題很容易解決為止
先看全排列怎麼分解成小問題:
假設要全排列“ABC”,先把A作為前部不變,全排列BC,同樣將B作為前部,全排列C,顯然是它本身
於是大問題變成了很容易解決的小問題了
如圖所示
程式碼如下
/* * 全排列演算法(遞迴實現) * author RogerNO1 */ #include <iostream> #include<string> using namespace std; void Permutations(char *pre, int level, char * data,int n) { level++;//遞迴層次增加; if(n==1){//要排列的序列長度為1時,列印一種排序 cout<<pre<<data<<endl; }else{ int i=0; while(data[i]!='\0'){ pre[level-1]=data[i];pre[level]='\0';//前部增長 char * data2=new char[n-1];//新陣列儲存要排序的後部 int j,p=0; for(j=0;j<n;j++){ if(i==j)continue; data2[p++]=data[j]; } data2[p]='\0'; Permutations(pre,level,data2,n-1); i++; } } } int main() { char * data="ABCD"; char *pre=new char[4];//pre用來儲存不變的前部 如ABCD,ABDC,AB不變 int level=0;//遞迴的層次 Permutations(pre,level,data,4); return 0; }