已知N個相異物,取出m個排列方法一共有
(題1)今寫一程式,當 m=N 時,將所有排列方法顯示出來。
範例:已知三個相異物 A、B、C,求顯示各種排列方法
輸出:
ABC
ACB
BAC
BCA
CAB
CBA


(題2)今寫一程式,當 m=1、2、...N 時,將各種所有排列方法顯示出來。
範例:已知三個相異物 A、B、C,求顯示各種排列方法
輸出:
A
B
C
AB
BA
AC
CA
BC
CB
ABC
ACB
BAC
BCA
CAB
CBA

演算法在此提供兩種演算法供大家參考。
(1)旋轉法
參考網站 https://openhome.cc/Gossip/AlgorithmGossip/Permutation.htm
旋轉法是比較容易了解,但程式碼不一定簡單,執行速度也不一定快。
觀察下列數字變化。

當 N=2 時:
1 自己旋轉,所以不動。
接著 1,2 旋轉,得到


當 N=3 時:

1 自己旋轉,所以不動。
剩下 2,3 比照上面 N=2 的方法做一次。(也就是遞迴N=2)

接著 1、2、3,之前面2位 1、2 旋轉,得到 2、1。

2不動。後面 1、3 遞迴 N=2。

接著 1、2、3,之前面3位 1、2、3 旋轉,得到 3、1、2。


3不動。後面 1、2 遞迴 N=2。

當 N=4 時:

1 自己旋轉,所以不動。
剩下 2、3、4 比照上面 N=3 的方法做一次。(也就是遞迴N=3)

接著 1、2旋轉,得到 2、1。

2不動。後面 1、3、4 遞迴 N=3。

接著 1、2、3旋轉,得到 3、1、2。

3不動。後面 1、2、4 遞迴 N=3。

接著 1、2、3、4 旋轉,得到 4、1、2、3。
4不動。後面 1、2、3 遞迴 N=3。

當 N=N 時:

1 自己旋轉,所以不動。
剩下 2、3...N 比照上面 N=N-1 的方法做一次。(也就是遞迴N=N-1)

接著 1、2旋轉,得到 2、1。

2不動。後面 1、3...N 遞迴 N=N-1。

接著 1、2、3旋轉,得到 3、1、2。

3不動。後面 1、2...N 遞迴 N=N-1。
...........................
依此類推直到最後一個,
接著 1、2、3...N 旋轉,得到 N、1、2...N-1。
N不動。後面 1、2...N-1 遞迴 N=N-1。

程式下載


(2)堆疊法

堆疊法是我個人想到的方法,不同於其他網站介紹的移位法,
演算法簡單,程式碼簡潔,不使用遞迴,執行速度快速。
以下是演算法
1.從 1 找到 N,凡是沒被使用的數字,有小到大依序 push 堆疊。
2.依序列印堆疊的內容。(由底至頂)
3.由堆疊內連續 pop 2 個數字,第二個數字若是 N 則步驟 4,否則步驟 5.
4.      pop 下一個數字並往上加 1,並查看此數是否被使用過,
         若是被使用過則往上再加 1,直到找到沒被使用的數字,然後 push 堆疊。
         並重複步驟 1.
         若不是被使用過,則直接 push 堆疊,重複步驟 1。
5.      往上加 1,並查看此數是否被使用過,
         若是被使用過則往上再加 1,直到找到沒被使用的數字,然後 push 堆疊。
         若找不到沒被使用的數字,而加到 N 了,則重複步驟 4。
         若不是被使用過,則直接 push 堆疊,重複步驟 1。
6.步驟 4,若 pop 到堆疊空了,則程式結束,


範例:
N=4 時
步驟說明堆疊內容
1: 從 1 至 N 找到無使用的數 push 到堆疊。 1、2、3、4
2: 輸出 1、2、3、4 1、2、3、4
3: 連續 pop 2 數。 1、2
5: 第二個數字是 3,加 1 得 4,並推入堆疊。 1、2、4
1: 從 1 至 N 找到無使用的數 push 到堆疊。 1、2、4、3
2: 輸出 1、2、4、3 1、2、4、3
3: 連續 pop 2 數。 1、2
4: 第二個數字是 4,再 pop。 1
4: pop 的數字是 2,加 1 得 3,並推入堆疊。 1、3
1: 從 1 至 N 找到無使用的數 push 到堆疊。 1、3、2、4
2: 輸出 1、3、2、4 1、3、2、4
3: 連續 pop 2 數。 1、3
5: 第二個數字是 2,加 1 得 3,被使用過,所以再加1得 4,並推入堆疊。 1、3、4
1: 從 1 至 N 找到無使用的數 push 到堆疊。 1、3、4、2
2: 輸出 1、3、4、2 1、3、4、2
3: 連續 pop 2 數。 1、3
4: 第二個數字是 4,再 pop。 1
4: pop 的數字是 3,加 1 得 4,並推入堆疊。 1、4
1: 從 1 至 N 找到無使用的數 push 到堆疊。 1、4、2、3
2: 輸出 1、4、2、3 1、4、2、3
3: 連續 pop 2 數。 1、4
5: 第二個數字是 2,加 1 得 3,並推入堆疊。 1、4、3
1: 從 1 至 N 找到無使用的數 push 到堆疊。 1、4、3、2
2: 輸出 1、4、3、2 1、4、3、2
3: 連續 pop 2 數。 1、4
5: 第二個數字是 3,加 1 得 4,但已被使用,則再 pop。 1
4 pop 數字是 4,再 pop。  
4 pop 數字加加 1得 2 ,沒被使用,所以 push。 2
1: 從 1 至 N 找到無使用的數 push 到堆疊。 2、1、3、4
2: 輸出 2、1、3、4 2、1、3、4
3: 連續 pop 2 數。 2、1
5: 第二個數字是 3,加 1 得 4,並推入堆疊。 2、1、4
1: 從 1 至 N 找到無使用的數 push 到堆疊。 2、1、4、3
2: 輸出 2、1、4、3 2、1、4、3
3: 連續 pop 2 數。 2、1
4: 第二個數字是 4,再 pop。 2、1
4: pop 的數字是 1,加 1 得 2,已被使用,再加 1 得 3,並推入堆疊。 2、3
1: 從 1 至 N 找到無使用的數 push 到堆疊。 2、3、1、4
2: 輸出 2、3、1、4 2、3、1、4
3: 連續 pop 2 數。 2、3
5: 第二個數字是 1,加 1 得 2,使用過,再加 1 ,直到 4 未使用過,並推入堆疊。 2、3、4
1: 從 1 至 N 找到無使用的數 push 到堆疊。 2、3、4、1
2: 輸出 2、3、4、1 2、3、4、1
3: 連續 pop 2 數。 2、3
4: pop 的數字是 4,再 pop 得 3,加 1 得 4,並推入堆疊。 2、4
1: 從 1 至 N 找到無使用的數 push 到堆疊。 2、4、1、3
2: 輸出 2、4、1、3 2、4、1、3
3: 連續 pop 2 數。 2、4
5: 第二個數字是 1,加 1 得 2,使用過,再加 1 ,得 3,並推入堆疊。 2、4、3
1: 從 1 至 N 找到無使用的數 push 到堆疊。 2、4、3、1
2: 輸出 2、4、3、1 2、4、3、1
3: 連續 pop 2 數。 2、4
5: 第二個數字是 3,加 1 得 4,但已使用過且等於 4,已經到 4 了,再 pop。 2
4: pop 的數字是 4,再 pop 得 2,再加 1 得 3,並推入堆疊。 3
1: 從 1 至 N 找到無使用的數 push 到堆疊。 3、1、2、4
2: 輸出 3、1、2、4 3、1、2、4
3: 連續 pop 2 數。 3、1
5: 第二個數字是 2,加 1 得 3,使用過,再加 1 ,得 4並推入堆疊。 3、1、4
1: 從 1 至 N 找到無使用的數 push 到堆疊。 3、1、4、2
2: 輸出 3、1、4、2 3、1、4、2
3: 連續 pop 2 數。 3、1
5: 第二個數字是 4,再 pop 。 3
4: pop 的數字是 1,加 1 得 2 並推入堆疊。 3、2
1: 從 1 至 N 找到無使用的數 push 到堆疊。 3、2、1、4
2: 輸出 3、2、1、4 3、2、1、4
3: 連續 pop 2 數。 3、2
5: 第二個數字是 1,加 1 得 2,使用過,再加 1,亦使用過,再加1得 4並推入堆疊。 3、2、4
1: 從 1 至 N 找到無使用的數 push 到堆疊。 3、2、4、1
2: 輸出 3、2、4、1 3、2、4、1
3: 連續 pop 2 數。 3、2
4: pop 的數字是 4,再 pop 得數字2,加 1 得 3,使用過,再加1得4 並推入堆疊。 3、4
1: 從 1 至 N 找到無使用的數 push 到堆疊。 3、4、1、2
2: 輸出 3、4、1、2 3、4、1、2
3: 連續 pop 2 數。 3、4、1、2
5: 第二個數字是 1,加 1 得 2,並推入堆疊。 3、4、2
1: 從 1 至 N 找到無使用的數 push 到堆疊。 3、4、2、1
2: 輸出 3、4、2、1 3、4、2、1
3: 連續 pop 2 數。 3、4
5: pop 的數字是 2,加 1 得 3,使用過,再加1得4,亦使用過,再 pop。 3
4: pop 的數字是 4,再 pop 得數字3,加 1 得 4 並推入堆疊。 4
1: 從 1 至 N 找到無使用的數 push 到堆疊。 4、1、2、3
2: 輸出 4、1、2、3 4、1、2、3
3: 連續 pop 2 數。 4、1
5: 第二個數字是 2,加 1 得 3,並推入堆疊。 4、1、3
1: 從 1 至 N 找到無使用的數 push 到堆疊。 4、1、3、2
2: 輸出 4、1、3、2 4、1、3、2
3: 連續 pop 2 數。 4、1
5: pop 的數字是 3,加 1 得 4,使用過,再 pop。 4
4: pop 的數字是 1,加 1 得 2 並推入堆疊。 4、2
1: 從 1 至 N 找到無使用的數 push 到堆疊。 4、2、1、3
2: 輸出 4、2、1、3 4、2、1、3
3: 連續 pop 2 數。 4、2
5: pop 的數字是 1,加 1 得 2,使用過,再加1得 3 並推入堆疊。 4、2、3
1: 從 1 至 N 找到無使用的數 push 到堆疊。 4、2、3、1
2: 輸出 4、2、3、1 4、2、3、1
3: 連續 pop 2 數。 4、2
5: pop 的數字是 3,加 1 得 4,使用過,再 pop。 4
4: pop 的數字是 2,加 1 得 3 並推入堆疊。 4、3
1: 從 1 至 N 找到無使用的數 push 到堆疊。 4、3、1、2
2: 輸出 4、3、1、2 4、3、1、2
3: 連續 pop 2 數。 4、3
5: pop 的數字是 1,加 1 得 2 並推入堆疊。。 4、3、2
1: 從 1 至 N 找到無使用的數 push 到堆疊。 4、3、2、1
2: 輸出 4、3、2、1 4、3、2、1
3: 連續 pop 2 數。 4、3
5: pop 的數字是 2,加 1 得 3,使用過,再加 1 得 4,使用過,則 pop 。 4
4: pop 的數字是 3,加 1 得 4,使用過,再 pop 。 4
4: pop 的數字是 4,再 pop 。  
6: 堆疊已空。程式結束。  

c Txt 程式下載 c 程式下載 1 c 程式下載 2