首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

用递归的方法找到n个不同元素的所有排列方式解决方法

2012-02-16 
用递归的方法找到n个不同元素的所有排列方式问题:请问下面题目中的list[k:m]list[0:k-1]是什么数组表示方

用递归的方法找到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

热点排行