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

帮小弟我参透全排列的递归算法,十万万万分感谢

2012-02-28 
帮我参透全排列的递归算法,十万万万分感谢先把程序贴出来#includestdio.hintmm0voidpermutation(chara

帮我参透全排列的递归算法,十万万万分感谢
先把程序贴出来

#include   <stdio.h>
int   mm=0;
void   permutation(char   a[],   int   m,   int   n)
{
int   i;
char   t;
if   (m <n-1)
{
permutation(a,   m+1,   n);
for   (i=m+1;i <n;i++)
{
t=a[m];  
a[m]=a[i];
a[i]=t;
permutation(a,   m+1,   n);
t=a[m];  
a[m]=a[i];
a[i]=t;
}
  }
else
{
printf( "%s\n ",   a);
mm++;
}
}
int   main()
{
char   a[]= "12345 ";
permutation(a,   0,5);
printf( "%d ",mm);
return   0;
}


相信这个程序很多人都看过了,可是我就是理解不了,首先声明,那个阶乘的例子我是已经相当明白了,不要再举那个简单的不能再简单的例子了~举个有点深度的例子,谢谢~~希望能说出来自己对递归的理解~~~



[解决办法]
//设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}
//(ri)Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀ri得到的排列
//
// (1)当n=1时,Perm(R)=(r),其中r是集合R中唯一的元素;
// (2)当n> 1时,Perm(R)可由(r1)Perm(R1),(r2)Perm(R2),…,(rn)Perm(Rn)构成
//
//此程序就是按照上述思想来设计的
//
//其中:
// Perm(list,k,m)递归地产生所有前缀是list[0:k-1],且后缀是list[k:m]的全排列的所有排列。那么调用算法Perm(list,0,n-1)则产生list[0:n-1]的全排列。
//
// for (i=k; i <= n; i++) {
// Swap (list[k], list[i]);
// Perm (list, k+1, n);
// Swap (list [k], list [i]);
// }
//以上这段代码其实就是实现的(2)的思想。


#i nclude "stdafx.h "
#i nclude
#i nclude

using namespace std;

void Swap(char& a, char& b)
{
char temp;
temp = a;
a = b;
b = temp;
}

void Perm(char s[], int k, int m)
{
if(k == m) // Print one permutation.
{
cout < < s < < endl;
}
else
{
for(int i = k; i <= m; i++)
{
Swap(s[k], s[i]);
Perm(s, k + 1, m);
Swap(s[k], s[i]);
}
}
}

int _tmain(int argc, _TCHAR* argv[])
{
char s[] = "123 ";
Perm(s, 0, 2);
return 0;
}

热点排行