1. 程式人生 > >遞迴之全排列演算法

遞迴之全排列演算法

問題

假設有 {1, 2, 3, ... n} 這樣一個序列,找出這個序列的所有全排列。

求解思路

第一位有 n 種可能性,確定了第一位後就是求解剩下 n - 1 個數據的排列問題,這樣就可以往下一直分解問題,直到序列結尾處,也就是終止條件。

第1位排列情況(無遞迴)

1 2 3
2 1 3
3 2 1

暫不考慮序列元素重複問題,測試序列{1,2,3}
#include <iostream>
using namespace std;
void Perm(int list[],int from,int n)
{
    for (int i = from;i < n;i++)
    {
        swap(list[from], list[i]);
        //交換一次輸出一次全排列
        for (int i = 0;i < n;i++)
            cout << list[i] << " ";
        cout << endl;
        //保證交換之前的序列還是 {1, 2, 3}
        swap(list[from], list[i]);
   
    }
}
int main()
{
    int list[] = { 1,2,3 };
    Perm(list, 0, 3);
    return 0;
}

 

所有的排列情況(遞迴第2位、第3位)

1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
#include <iostream>
using namespace std;
void Perm(int list[],int from,int n)
{
    //迴圈終止條件
    if (from == n)
    {
        //交換一次輸出一次全排列
        for (int i = 0;i < n;i++)
            cout << list[i] << " ";
        cout << endl;
        return;
    }
    for (int i = from;i < n;i++)
    {
        swap(list[from], list[i]);
        //加入遞迴
        Perm(list, from + 1, n);
        //保證交換之前的序列還是 {1, 2, 3}
        swap(list[from], list[i]);
    }
}
int main()
{
    int list[] = { 1,2,3 };
    Perm(list, 0, 3);
    return 0;
}