7.2.1 生成1-n的排列
阿新 • • 發佈:2018-11-28
【問題描述】
嘗試用遞迴的方法:先輸出所有以1開頭的排列,然後輸出以2開頭的排列,…一直到輸出完以9開頭的排列。
【虛擬碼】
void print_permutation(序列 A,集合 S)
{
if(S為空) 輸出序列A;
else 按照從小到大的順序依次考慮S的每個元素V
{
print_permutation(在A的末尾新增V後得到的新序列,S-{V});
}
}
【程式碼】
由於集合S可以用序列A表示出來–遍歷1-N的所有數,只要A中沒有出現的元素即可使用,因此可以不使用S儲存剩餘元素的集合。由於陣列的大小未知,因此引數應該包括陣列大小n。由於需要確定遞迴的終止條件,也就是將最後一個元素排列好即可終止,因此還需要傳參cur來確定當前的位置。
void print_permutation(int n,int *a,int cur) { if (cur == n) { for (int i = 0;i < n;i++) cout << a[i]; cout << endl; } else for (int i = 1;i <= n;i++){ int flag = 1; for (int j = 0;j < cur;j++) if (i == a[j]) flag = 0; //如果i在a[0]~a[cur-1]中出現過就不再選 if (flag) { a[cur] = i; print_permutation(n, a, cur + 1);//遞迴呼叫 } } }