C++算法——用递归求排列
来源:互联网 发布:研究网络暴力的意义 编辑:程序博客网 时间:2024/06/07 01:01
通常我们希望检查n 个不同元素的所有排列方式以确定一个最佳的排列。比如,
a,b 和c 的排列方式有:a b c, a c b, b a c, b c a, cab 和c b a。n 个元素的排列方式共有n !种。
由于采用非递归的C + +函数来输出n 个元素的所有排列方式很困难,所以可以开发一个递
归函数来实现。令E= {e1 , ..., en }表示n 个元素的集合,我们的目标是生成该集合的所有排列方
式。令Ei 为E中移去元素i 以后所获得的集合,perm (X) 表示集合X 中元素的排列方式,ei . p e r m
(X)表示在perm (X) 中的每个排列方式的前面均加上ei 以后所得到的排列方式。例如,如果
E= {a, b, c},那么E1= {b, c},perm (E1 ) = ( b c, c b),e1 .perm (E1) = (a b c, a c b)。
对于递归的基本部分,采用n = 1。当只有一个元素时,只可能产生一种排列方式,所以
perm (E) = ( e),其中e 是E 中的唯一元素。当n > 1时,perm (E) = e1 .perm (E1 ) +e2 .p e r m
(E2 ) +e3.perm (E3) + ⋯ +en .perm (En )。这种递归定义形式是采用n 个perm (X) 来定义perm (E), 其
中每个X 包含n- 1个元素。至此,一个完整的递归定义所需要的基本部分和递归部分都已完成。
第1章C ++程序设计7
下载
当n= 3并且E=(a, b, c)时,按照前面的递归定义可得perm (E) =a.perm ( {b, c} ) +b.perm ( {a,
c} ) +c.perm ( {a, b} )。同样,按照递归定义有perm ( {b, c} ) =b.perm ( {c} ) +c.perm ( {b}), 所以
a.perm ( {b, c} ) = ab.perm ( {c} ) + ac.perm ( {b}) = a b . c + ac.b = (a b c, a c b)。同理可得
b.perm ( {a, c}) = ba.perm ( {c}) + bc.perm ( {a}) = b a . c + b c . a = (b a c, b c a),c.perm ( {a, b}) =
ca.perm ( {b}) + cb.perm ( {a}) = c a . b + c b . a = (c a b, c b a)。所以perm (E) = (a b c, a c b, b a c, b c a,
c a b, c b a)。
#include <iostream>
using namespace std;
void Swap(char &a,char &b)//交换
{
char tmp;
tmp=a;
a=b;
b=tmp;
}
void Permutation(char src[],int begin,int end)
{
if (begin==end)
{
for (int i = 0; i <= end; i++)
cout << src[i];
cout << endl;
}
for (int i=begin;i<=end;++i)
{
Swap(src[begin],src[i]);
Permutation(src,begin+1,end);
Swap(src[begin],src[i]);
}
}
void main()
{
char src[3]={'a','b','c'};
Permutation(src,0,2);
cin.get();
}
- C++算法——用递归求排列
- 求模(非递归)全排列算法——Javascript实现
- 求字符串全排列的递归算法
- 递归算法:求序列的全排列
- 求字符串全排列的递归算法
- C++:用递归算法求阶乘
- 算法——全排列递归实现
- 递归算法——全排列
- 全排列——递归算法
- 求集合子集,和全排列的递归算法实现(c++,Dev C++调试通过)
- 全排列的算法(七)——递归算法
- C算法-求组合排列可能性
- 递归求排列问题
- 递归求排列
- 求字符串全排列的递归算法(java程序)
- 求数组全排列算法的递归实现
- 递归算法(归并排序):求排列的逆序数
- 全排列—递归
- Android 事件监听
- C++ Primer:Exercises Section 1.5.2
- debug私钥过期导致eclipse无法重编译生成apk
- cocos2d 使用小记
- 问佛——仓央嘉措
- C++算法——用递归求排列
- C# 打开应用程序或打开默认电子邮件应用程序
- Linux下两台笔记本电脑adhoc模式搭建局域网跟adhoc无线自组织网络
- NSString NSData 转换与常见的 NSString 和 NSMutableString 方法
- META中没有REMOTE_ADDR
- java synchronized详解
- linux安装memcached
- VC6中一个顽固很久CImageList的GDI泄露
- OFFICE EXCEl替换时,只想替换符合要求的单击格