c语言函数训练之全排列 c语言输出排列组合的函数

c语言全排列

这个说起来太麻烦了, 我找了一个, 你看看行不, 不可以的话, 私聊吧.

我们提供的服务有:成都网站制作、成都做网站、微信公众号开发、网站优化、网站认证、黄平ssl等。为上1000+企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的黄平网站制作公司

全排列用的是 置换算法,

算法这东西重在理解。具体代码并不那么重要。

全排列是将一组数按一定顺序进行排列,如果这组数有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、 5 4 3 六组数。

即以3开头的和4,5的全排列的组合、以4开头的和3,5的全排列的组合和以5开头的和3,4的全排列的组合.

从而可以推断,设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}。

因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。当n = 1时perm(p} = r1。

为了更容易理解,将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。

算法如下:

#include stdio.h

int n = 0;

void swap(int *a, int *b)

{

int m;

m = *a;

*a = *b;

*b = m;

}

void perm(int list[], int k, int m)

{

int i;

if(k m)

{

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()

{

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

perm(list, 0, 4);

printf("total:%d\n", n);

return 0;

}

链接:

c语言,函数全排列,求代码,如图?

#include stdio.h

char c,s[10];

int n;

void pern(int k)

{int i;

if(k==n)

printf("%s\n",s+1);

else

for(i=k;i=n;i++)

{c=s[k];s[k]=s[i];s[i]=c;

pern(k+1);

c=s[k];s[k]=s[i];s[i]=c;

}

}

int main()

{ int i;

scanf("%d",n);

for(i=1;i=n;i++)

s[i]='0'+i;

pern(1);

return 0;

}

C语言的全排列问题!急!

这其实是一个递归

递归函数

意思是这样的

比如有n个数

1

2.。。。n

把1

从第一个开始

往后

与每个数开始交换

然后

第一个数就算定了

后面的

第2个到第n个当成一个整体

再进行这个函数递归

也就是说

第二个到第n个进行全排列

这样下去

当全排列到最后一组数

即第n个数一个的时候

递归退出条件就出来了

就可以输出全排列的值了

当然

最后别忘记把交换的数还原

再进行下一次交换

递归哦

所以最后一局的交换也是很重要的

听完我的解释

再好好琢磨一下

相信你一定会明白的

要是还是不懂可以继续追问我

C语言求全排列

像for(int i=0;in;i++)c语言里变量定义不能这样吧。要把int定义前面的吧。把所有变量定义改了,用C-Free程序运行是正常的。

#include stdio.h

#define N 10

swap(int *p,int *q)

{

int temp;

temp=*p;

*p=*q;

*q=temp;

}

sort(int a[],int k,int n)

{ int temp1,temp2,j,i;

if(k==n)

{

for( i=0;i=n;i++)

printf("%d",a[i]);

printf("\n");

}

else{

for(j=k;j=n;j++)

{

swap(a[k],a[j]);

sort(a,k+1,n);

swap(a[k],a[j]);

}

}

}

main()

{

int a[N];

int n,i;

scanf("%d",n);

for(i=0;in;i++)

scanf("%d",a[i]);

sort(a,0,n-1);

}

C语言 全排列······晕

首先,我下面的叙述是建立在楼主明白什么是递归调用的基础上的。对递归毫无了解的话,请先看看百度百科。

然后,进入正题。

第一个return:就是返回这个函数的调用者,这个函数执行完毕。这是一个if判断,当带排列的数列长度为1时,只有一种可能,输出,则排列结束,返回。长度不只1的时候,执行以下for。

未完待续

接着讲这个

for(i=0;in;i++){----------这个循环到底怎么个看法和顺序?

anagram(d,n-1); 怎么输出的??(这块都不明白)

temp=d[0];

for(j=1;j=n-1;j++){

d[j-1]=d[j];

}

d[n-1]=temp;

}

先讲这个算法的思想,比如对abc进行全排列,那么可以看做:ab的全排列+c和ac的全排列+b和bc的全排列+a三个的组合。然后再细化,ab的全排列可以看出a的全排列+b,和b的全排列+a两个的组合。当只有一个时,就是调用if=1的那个情况,直接print。不是1的时候,就是递归调用,进行不断地分解。

这是算法思想,未完待续

两个for循环,里面的for执行一边后就是把数组的元素挨个往前挪一位,第一位到最后位,然后对前n-1位进行全排列,递归进行。从上面的算法思想中我们可以看出这样的目的和意义,就是一个类似对上面abc的分解过程,一次a到最后排bc,一次b到最后排ac,一次c到最后排ab。

就先说这么多吧。纯手打,望采纳!有问题可以补充,或者百度hi我。

我帮你改了一下代码,加了几行printf,希望可以解决你的那几个问题:

#includestdio.h

#define NUM 3

void anagram(int[],int);

void print(int[]);

void main()

{

int d[NUM];

int i;

for(i=0;iNUM;i++)

d[i]=i + 1;

printf("初始化后的数组顺序是:");

print(d);

anagram(d,NUM);

}

void anagram(int d[],int n)

{

int i,j,temp;

int p;

if(n==1){

print(d); //打印函数

return;//-------------return返回哪?

} // 和下面的for怎么联系起来?

for(i=0;in;i++){//----------这个循环到底怎么个看法和顺序?

printf("\ni = %d,n = %d, 准备调用aragram(d,%d)\n",i,n,n-1);

printf("这时候的数组顺序是:");

print(d);

anagram(d,n-1); // 怎么输出的??(这块都不明白)

temp=d[0];

for(j=1;j=n-1;j++){

d[j-1]=d[j];

}

d[n-1]=temp;

}

}

void print(int d[]){

int i;

for(i=0;iNUM;i++){

printf("%d",d[i]);

}

printf("\n");

}

PS:

改动:1、print函数原来是逆序输出,改成正序输出,有利于理解;2、数组原来初始化为321,改为123,有利于理解。就改了这两个地方,加了一些printf。

你可以运行一下。

输出结果:

初始化后的数组顺序是:123

i = 0,n = 3, 准备调用aragram(d,2)

这时候的数组顺序是:123

i = 0,n = 2, 准备调用aragram(d,1)

这时候的数组顺序是:123

123

i = 1,n = 2, 准备调用aragram(d,1)

这时候的数组顺序是:213

213

i = 1,n = 3, 准备调用aragram(d,2)

这时候的数组顺序是:231

i = 0,n = 2, 准备调用aragram(d,1)

这时候的数组顺序是:231

231

i = 1,n = 2, 准备调用aragram(d,1)

这时候的数组顺序是:321

321

i = 2,n = 3, 准备调用aragram(d,2)

这时候的数组顺序是:312

i = 0,n = 2, 准备调用aragram(d,1)

这时候的数组顺序是:312

312

i = 1,n = 2, 准备调用aragram(d,1)

这时候的数组顺序是:132

132

请按任意键继续. . .

用c语言编写全部排列

void chang(char str[],int m) /*定义循环左移函数(我没有用左移函数)*/

{

int i,j;

char temp=str[0];

for (i=0;im;i++) str[i]=str[i+1];

str[i]=temp;

}

void pai(char str[],int m,int n) /*定义全排列函数*/

{

int k;

void chang(char str[],int m);

if (mn) /* 定 义 递 归 调 用 出 口 */

{

for (k=0;k=m;k++)

{

pai(str,m+1,n); /*递归调用*/

chang(str,m); /*调用左移函数*/

}

}

else printf("%s\t",str);

}

#include "stdio.h"

main()

{char str[]="ABCD"; /*全排列字符,可以任意多个(相应的下面排列函数中参数"4"改成全排列字符的个数)*/

clrscr();

pai(str,0,4); /*这里参数0(下标)表示从第一个元素开始,4表示元素个数(不是下标)*/

getch();

}


网页标题:c语言函数训练之全排列 c语言输出排列组合的函数
文章起源:http://scyanting.com/article/hihsei.html