递归算法-->全排列

何为全排列?

就比如说: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函数,

一个是为了交换一个是为了恢复。

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值