博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
递归复习,递归输出字符串的全排列
阅读量:5376 次
发布时间:2019-06-15

本文共 1118 字,大约阅读时间需要 3 分钟。

 

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

 

 

 

转载于:https://www.cnblogs.com/slankka/p/9158546.html

你可能感兴趣的文章
Oracle字符串拼接
查看>>
oracle 表连接问题
查看>>
NOJ——1658平方和(自然数平方和公式和取模法则)
查看>>
【php数组函数序列】之array_shift() - 删除数组中的第一个元素
查看>>
linux中重要数据声明
查看>>
一份完整的阿里云 Redis 开发规范,值得收藏!
查看>>
vs2008转vs2010发布网站注意事项
查看>>
2019.04.11 电商总结
查看>>
DB2时间函数大全(转)
查看>>
Unity3d Shader开发(四)UsePass ,GrabPass ,SubShader Tags
查看>>
flutter 读取sdcard权限问题相关
查看>>
js获取元素节点
查看>>
吴裕雄--天生自然 PHP开发学习:函数
查看>>
TCP连接中的TIME_WAIT状态二
查看>>
常用的HDFS操作
查看>>
第四周作业
查看>>
腾讯分析系统架构解析
查看>>
UglifyJS压缩JS
查看>>
PHP array_diff_uassoc
查看>>
Word添加论文引用标注
查看>>