何为全排列?
就比如说:123;
其全排列为:123 132 213 231 321 312
void swap(int &a,int&b)
{
int temp;
temp = a;
a = b;
b = temp;
cout<<"交换了"<<a<<" 和 "<<b<<endl;//为了方便理解,加了一句。
}
void perm(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++)
{
swap(list[k],list[i]);//交换
perm(list,k+1,m);
swap(list[k],list[i]);//恢复原样
}
}
int main()
{
int list[] = {1,2,3};
perm(list,0,2);
return 0;
}
(因为网不太好所以我就手打,没传照片)
打印结果:
交换了1和1
交换了2和2
1 2 3
交换了2和2
交换了3和2
1 3 2
交换了2和3
交换了1和1
交换了2和1
交换了1和1
2 1 3
交换了1和1
交换了3和1
2 3 1
交换了1和3
交换了1和2
交换了3和1
交换了2和2
3 2 1
交换了2和2
交换了1和2
3 1 2
交换了2和1
交换了1和3
-------------------------------------------------------------------------------------------------------------------------------------------------------------
虽然递归代码很简洁,但是理解起来确实挺费劲的。所以我就大致分析了前几个:
首先,从主函数里传参进去之后:(下面说的交换1 2 3 都是数值--------仅交换)
1和1交换 ----------------------------------------- 进第1次perm
2和2交换 ----------------------------------------- 进第2次perm
等到3的时候,就满足条件k==m
输出:1 2 3
-------------------------------------------------------跳出第2次perm
k和i都没有变所以又是上面2和2交换。
再走for循环,i = 2了。list[i] = 3了。k没有变,所以
3和2交换-------------------------------------------进第2次perm
k+1 又到3了,满足k== m
输出:1 3 2
------------------------------------------------------跳出第2次perm
k和i都没有变所以又是上面3和2交换。//换而言之,这就是为了恢复出原来的123.
而这时候i==m了,所以也就相当于else走完了。
------------------------------------------------------跳出第1次perm
k和i保持第一次的,所以
1和1交换,for循环往后走,k=0不变,i为1了。
2和1交换--------------------------------------------进第1次perm
。。。。。。
就这样依次类推
。。。。。。
{
简单理解,他之所以写两个swap函数,
一个是为了交换一个是为了恢复。
}