用递归的方法找到n个不同元素的所有排列方式
问题:
请问下面 题目中的 l i s t [ k:m] l i s t [ 0:k-1] 是什么数组表示方式?
是什么意思?
题目如下:
用递归的方法找到n个不同元素的所有排列方式
//Function: 用递归的方法找到n个不同元素的所有排列方式
//递归原理:
//令E= {e1 , ..., en }表示n 个元素的集合,我们的目标是生成该集合的所有排列方式。
//令Ei 为E中移去元素i 以后所获得的集合,perm (X) 表示集合X 中元素的排列方式,ei.perm
//(X)表示在perm(X) 中的每个排列方式的前面均加上ei 以后所得到的排列方式。对于递归的基本部分,采用n = 1。
//当只有一个元素时,只可能产生一种排列方式,所以
//perm (E) = ( e),其中e 是E 中的唯一元素。当n > 1时,perm (E) = e1.perm (E1 ) +e2.perm(E2)+e3.perm(E3)+ ...
//+en .perm (En )。这种递归定义形式是采用n 个perm(X)来定义perm (E), 其每个X 包含n- 1个元素。至此,
//一个完整的递归定义所需要的基本部分和递归部分都已完成。
//程序说明:
//程序把上述perm (E) 的递归定义转变成一个C++ 函数,这段代码输出所有前缀为list[0:k-1], 后缀为list[k:m]的排列方式。
//调用Perm(list, 0, n-1) 将得到list[0: n-1] 的所有n! 个排列方
//式,在该调用中,k=0, m= n - 1,因此排列方式的前缀为空,后缀为list[0: n-1] 产生的所有排列
//方式。当k =m 时,仅有一个后缀l i s t [ m ],因此list[0: m] 即是所要产生的输出。当k <m时,先
//用list[k] 与l i s t [ k:m] 中的每个元素进行交换,然后产生list[k+1: m] 的所有排列方式,并用它
//作为list[0: k] 的后缀。
//Swap是一个inline 函数,它被用来交换两个变量的值.Perm其定义见程序的正确性可用归纳法来证明。
#include <iostream.h>
template <class T>
inline void Swap(T& a, T& b)
{// 交换a和b
T temp = a; a = b; b = temp;
}
template <class T>
void Perm(T list[], int k, int m) //list[] is the array for sorting
{
//生成list [k:m ]的所有排列方式
int i;
if (k == m) {//输出一个排列方式
for (i = 0; i <= m; i++) // 因为list[0]至list[m-1]存储了交换后的数组值
cout < < list [i];
cout < < endl;
}
else // list[k:m ]有多个排列方式
// 递归地产生这些排列方式
for (i=k; i <= m; i++)
{
Swap (list[k], list[i]);
Perm (list, k+1, m);
Swap (list [k], list [i]);// 再换回去,
}
}
void main()
{
char a[4]={ 'a ', 'b ', 'c ', 'd '};
Perm(a,1,3);
}
[解决办法]
k:m
0:k-1
这个表示的是数组的索引 从 0到 k-1, 从 k到m