A上3下5(c上标3下标5怎么算

主题: (1)一组数字的全排列;(2)求一组数字中几个数字的组合

一.数组算法:

所有数组是将一组数按照一定的顺序排列而成的,如果一组数有n个,则所有数组数为n! 个。 本节以{ 1,2,3 }为例,说明如何创建所有数组的递归算法。 如下图所示。

在上图中,第一层S1表示第一个数分别与第一、二、三个数交换的位置。 例如,123与第一个数1交换,213与第一个数2交换,321与第三个数交换。 第二层S2是第二个数分别与第二、第三个数交换位置. 最后一层所有叶的节点是全数组的所有结果。 第k层的节点Sk是母节点的第k个个数,分别与第k、k 1.n个个数交换位置。

递归算法代码:

代码#include stdio.h

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;

}

二、组合算法:

组合是指从n个中选择m个的所有组合。 (n=m ) )。

运用递归思想,假设n=4,m=2,数组a { 1,2,3,4 },算法思想如下图所示。

在上图中,第1层中的S1节点是数组中的所有数字,第二个S2节点分别从父节点的下一个位置开始。 在这个例子中,m=2,所以一共是2楼。 从一楼到二楼,深入遍历这棵树,就会得到所有的组合。

递归算法代码:

代码#include vector

#include iostream

用户命名空间STD;

voidcomb(intindex、int begin、int len、int n、int *A、int *C );

int main () )

{

inta [5]={ 1,2,3,4,5 };

int len=5,n=3;

int *C=new int[n 1];

comb (0,0,len,n,a,c );

delete []C;

返回0;

}

//递归组合

voidcomb(intindex、int begin、int len、int n、int *A、int *C ) ) ) ) ) ) ) ) ) )。

{ //index表示某个组合中的索引,begin表示从数组a中的begin的位置开始查找,

//len表示阵列a长度,n表示组合中的个数,a表示原始阵列,c表示组合阵列

if(index==n ) )。

{

for(intI=0; in; I )

coutC[i] ‘;

coutendl;

返回;

}

for(intj=Begin; j=len-n index; j )

{

C[index]=A[j];

comb (索引1,j 1,len,n,a,c );

}

}

转载于:https://www.cnblogs.com/仁爱汽车1988 happy/archive/2011/12/13/2285819.html

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注