递归复习,递归输出字符串的全排列

/*
例子123进行全排列,那么包含以下几部分
1)1是第一位的时候,对剩下的2,3进行全排列;
2)2是第一位的时候(将2和1交换),对剩下的1,3进行全排列;
3)3是第一位的时候(将3和1交换),对剩下的1,2进行全排列;
可以看到,每次递归是后面的值和起始位置交换,但每次都要保证原始顺序不变(不然不能保证和1进行交换)
所以第一次交换是每次将后面的值一次交换到起始位置,再对后面的进行全排列;
第二次的交换是要将前面的交换再交换回来,保证最初的原始排列不发生变化。
 */
#include<iostream>
using namespace std;

template <class Type>
void Perm(Type list[], int k, int m) //list[k...m]
//k和m分别表示要进行全排列的元素范围,即两个端点的index,k为开始的index,m为结束端点index。 
{
	if(k==m)                       
	{
		for(int i=0; i<=m; i++)
			cout << list[i];
		cout << endl;
	}
	else
		for(int j=k; j<=m; j++)
		{
			Swap(list[k],list[j]);
			Perm(list, k+1, m);
			Swap(list[k],list[j]);
		}
}

template<class Type>
inline void Swap(Type &a, Type &b)
{
	Type temp=a;
	a=b;
	b=temp;
}

int main(){
	char ch[]="abc";
	Perm(ch,0,3);

}





原理就是

perm(abc)=  a + perm(bc) ---a和a换,然后计算子问题,计算完了还原

    + b + perm(ac) --- a和b换,同上

    + c + perm(ba) --- a和c换,同上

子问题依此类推。


三个组合起来用for循环来处理。

for(int j=k; j<=m; j++)
		{
			Swap(list[k],list[j]);//将问题第一个元素和 [j] 交换。
			Perm(list, k+1, m);// 计算子问题 即除了第一个元素的后面的全排列。
			Swap(list[k],list[j]);//然后把 第一个元素 和[j]再换回来。
		}
for循环 是 把 多个 递归 累加起来的。




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值