【C++數據結構】算法:遞歸實現全排列算法(Permutations)

 思路

首先對於一個給定的字符 【abcd】,很明顯,最容易想到的全排列方式是先固定住a,然後把bcd給全排列,然後繼續分解便是,固定住ab,把cd給全排列了,而此時的cd的全排列,便是cd位置進行調換

  1. 確定函數及參數  Perm(char str[], int begin, int end),其中,str 爲需要全排列的數組,begin代表數組首位,end代表這次全排列過程中,數組的最大索引,也就是這個數組的長度-1,比如abcd,第一次遞歸時, begin 爲 0 ,end 爲 這個數組長度-1 爲 3。
  2. 設置函數內的變量 i 作爲可以變動的索引值
  3. 首先固定第一個字符,i = begin,開始遞歸時,begin = 0,此時 i = 0,對 i <=3開始循環,目的是,依次固定首字母,此時固定了a,for 循環體內的Perm開始對bcd進行遞歸,固定了b。
  4. 最後需要一個遞歸出口,也就是當函數最後begin = end時,我們知道,此時無法繼續全排列了,只剩下一個字符,輸出數組。遞歸結束。
#include <iostream>
#include<string.h>
using namespace std;

void Perm(char str[], int begin, int end) {
    int i;
    if (begin == end) {
        for (i = 0; i <= end; ++i)
            cout << str[i];
        cout << endl;
    } else {
        for (i = begin; i <= end; ++i) {
            swap(str[i], str[begin]);
            Perm(str, begin+1, end);
            swap(str[i], str[begin]);
        }
    }
}

int main() {
    char str[] = {'a','b','c'};
    int len = sizeof(str)/ sizeof(str[0])-1;
    Perm(str, 0, len);

    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章