所有数组是将一组数按照一定的顺序排列而成的,如果一组数有n个,则所有数组数为n! 个。 本节以{1、2、3、4、5}为例,说明如何创建所有数组的递归算法。
1、先看最后两个数4、5。 它们的全部序列是4 5和5 4,即以4开始的5的全部序列和以5开始的4的全部序列。
因为一个数的全部排列是其自身,所以得到以上的结果。
2、看看后面的三个数3、4、5。 它们的全部排列为3 4 5、3 5 4、4 3 5、4 5 3、5 3 4、54这6组数。
也就是说,以3开始的和4,5的全部排列的组合,以4开始的和3,5的全部排列的组合,以5开始的和3,4的全部排列的组合。
因此,如果设一组数p={r1,r2,r3,rn},则可以推测全部序列为perm(P ),pn=p - {rn}。
因此,perm(p )=R1perm ),P1 ),R2perm ),R3perm ),rnperm ) pn )。 n=1时,perm(p )=R1。
为了清楚起见,如果将组整体数中的所有数分别与第一个数进行交换,则总是处理后的n-1个数的全部数组。
算法如下。
#包含
int n=0;
语音快照(int *b,int *b ) )。
{
int m;
m=*a;
*a=*b;
*b=m;
}
voidperm(intlist[],int k,int m ) )。
{
int i;
If (千米) )。
{
for(I=0; i=m; I )
printf('%d ',list[i] );
printf((n );
n;
}
else
{
for(I=k; i=m; I )
{
swap(list[k],list[i];
perm(list,k 1,m );
swap(list[k],list[i];
}
}
}
int main () )
{
intlist [ ]={ 1,2,3,4,5 };
perm (列表,0,4 );
printf (总3360 % d (n ),n );
返回0;
}
如果有更高效的递归算法和非递归算法,请重新粘贴。