(线性代数相关) 递归取全排列
- 两个数排列,两两交换
1 | swap(1, 2) => \begin{cases} |
三个数排列,三三交换(提取一个数,剩下的两两交换,然后与提取出的数合成新排列)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19swap(1, 2, 3) => \begin{cases}
1 + swap(2, 3) => 1 + \begin{cases}
2, 3 => 1, 2, 3 \\
\\
3, 2 = > 1, 3, 2
\end{cases}\\
\\
2 + swap(1, 3) => 2 + \begin{cases}
1, 3 => 2, 1, 3 \\
\\
3, 1 = > 2, 3, 1
\end{cases}\\
\\
3 + swap(1, 2) => 3 + \begin{cases}
1, 2 => 3, 1, 2\\
\\
2, 1 => 3, 2, 1
\end{cases}\\
\end{cases}四个数排列,四四交换(提取一个数,剩下的三三交换,然后与提取出的数合成新排列)
1
2
3
4
5
6
7
8
9swap(1, 2, 3, 4) => \begin{cases}
1 + swap(2, 3, 4)\\
\\
2 + swap(1, 3, 4)\\
\\
3 + swap(1, 2, 4)\\
\\
4 + swap(1, 2, 3)\\
\end{cases}依次类推,有N个数排列时,提取1个,剩下的(N-1)个数进行交换,然后与提取出的数合成新排列
1 | swap(1, 2, 3 ... N) => \begin{cases} |
- 借助递归思想,有N个数时,可以逐层展开,直到剩下两个数互相交换后返回
python实现:
1 | # 递归取全排列,输入为数组 |