遞迴之全排列演算法
阿新 • • 發佈:2020-03-11
問題
假設有 {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; }