1. 程式人生 > >7.2.1 生成1-n的排列

7.2.1 生成1-n的排列

【問題描述】
嘗試用遞迴的方法:先輸出所有以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);//遞迴呼叫
		}
	}
}