递归复习,递归输出字符串的全排列
2015-09-04 10:01
381 查看
/*
例子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循环来处理。
例子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循环 是 把 多个 递归 累加起来的。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- 数据库链接字符串查询网站
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Flex字符串比较 还有Flex字符串操作
- Ruby中创建字符串的一些技巧小结
- ASP下经常用的字符串等函数参考资料
- 将字符串小写转大写并延时输出的批处理代码
- 将字符串转换成System.Drawing.Color类型的方法
- Lua中调用C++函数示例
- Lua源码中字符串类型的实现
- Lua性能优化技巧(四):关于字符串
- Lua教程(一):在C++中嵌入Lua脚本
- 字符串聚合函数(去除重复值)
- Ruby中的字符串编写示例
- Lua教程(二):C++和Lua相互传递数据示例
- 总结的5个C#字符串操作方法分享
- sqlserver中求字符串中汉字的个数的sql语句
- sql server字符串非空判断实现方法