#include<iostream>
#include<iterator>
using namespace std;
//1、关键:先想函数作用:这个函数作用是输出从第k个位置到第m个数(第m-1个位置)的全排列
void perm(int list[], int k, int m)
{
if (k==m)
{
copy(list,list+m,ostream_iterator<int>(cout," ")); //拷贝迭代器,作用是将List中的元素逐个输出
cout<<endl;
return;
}
for (int i=k; i<m; i++) //初始状态 k=0,m=4;
{
swap(list[k],list[i]); //i从第k个位置开始,一直到第m-1个位置,交换他们的值。假设函数已经执行完i=0了,此时k=0,i=1,交换后list成2134
perm(list,k+1,m);
//这时候执行函数(作用上面写了):对于数组2134,输出第k+1个位置到第m-1个位置的全排列,即操作(list[1]到list[3]的全排列),也就是此时的list[0] = 2不变,后面三个数134的全排列
//而输出134的全排列依然是用到perm函数,再按函数作用来理解,1不变的时候输出34全排列,3不变的时候...4不变的时候...etc
//如果递归到k==m,此时第k个位置到第m-1个位置范围不存在,这时候函数就把刚才经过一系列交换操作得到的数组输出
swap(list[k],list[i]); //经过一系列操作之后得到了以list[1]=2开头的全排列,这个时候交换回来,list还得是原来的list1234,此时i++,再进行list[2]=3作为开头的一系列操作。
}
}
int main(){
int list[4] = {1,2,3,4};
perm(list,0,4);
cout<<"---------"<<endl;
perm(list,2,4); //为了便于理解函数作用,加一个这个,则输出 1234与1243
}