某乎能粘贴表格,排版更好看
e.g. 1,2,3的全排列
k表示层数<角标>(从0到2,共三层)
K=0 1 2&1
Swap 1和1 1&1
K=1 2 知乎
Swap 2和2 2&2->for 3&2->out 2&3->swap
K=2 3
Swap 3&3
Out: 1,2,3->swap 1,3,2->swap
图例:递归一次先去确定第一位,然后深入挖掘到最后一层,输出一个排列,再返回上一层交换。
递归前后两次交换的意义:
第一次:
形成新的排列
第二次:
还原成最初的排列,为下一次的交换做准备。
逻辑:
按住前面不放,从最后开始一个一个进行交换
递归特点:每一层,k不变
/*#include<iostream>
#include<string>
#include<cmath>
#include<iomanip>
using namespace std;
int main()
{
}*/
#include<iostream>
using namespace std;
void swap(int& a, int& b)
{
int t;
t = a;
a = b;
b = t;
}
void process(int*list, int k, int m)
{
if (k == m)
{
for (int i = 0; i <= m; i++)
cout << list[i];
cout << endl;
}
else {
for (int i = k; i <= m; i++)
{
if (k == 0)cout << "第一层" << endl;
swap(list[i], list[k]);
process