void perm(int list[], int k, int m)
{
if ( )
{
copy(list,list+m,ostream_iterator<int>(cout," "));
cout<<endl;
return;
}
for (int i=k; i<=m; i++)
{
swap(&list[k],&list[i]);
( );
swap(&list[k],&list[i]);
}
}
解析:
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作为开头的一系列操作。
}