递归复习,递归输出字符串的全排列
来源:互联网 发布:网络产品包装的作用 编辑:程序博客网 时间:2024/06/04 19:13
/*例子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;}elsefor(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循环 是 把 多个 递归 累加起来的。
0 0
- 递归复习,递归输出字符串的全排列
- JAVA递归和非递归输出字符串的全排列
- 字符串的全排列 递归
- 字符串的排列,递归输出
- 递归输出全排列
- 递归 输出全排列
- 字符串-字符串的全排列-递归实现
- 输出字符串的所有全排列(递归法和非递归,非递归采用组合数学的字典序)
- 求字符串全排列的递归算法
- 字符串的全排列【递归算法训练】
- 字符串全排列的递归实现
- 求字符串全排列的递归算法
- 输出全排列--循环+递归
- 利用递归输出全排列
- 输出全排列(递归&非递归)
- 【递归】输出一个字符串的所有排列
- 字符串全排列的递归和非递归实现
- 字符串的全排列详解,递归+非递归
- 剑指offer:二维数组中的查找
- 无法解析的外部符号__imp__AlphaBlend@44
- 几种进程间的通信方式
- JPA实现的CRUD
- 推送机制
- 递归复习,递归输出字符串的全排列
- 我是菜鸟:concurrentHashMap实现原理
- 【笔试】41、二叉搜索树的后序遍历列
- Button 样式及selector选择器
- 原来UIWindow可以自定义frame
- TQ2440 学习笔记—— 21、中断体系结构
- 树状数组求区间最大值
- 不要怀疑家人的爱
- 半边数据结构及其使用