帮我参透全排列的递归算法,十万万万分感谢
先把程序贴出来
#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;
}