当前位置:首页 » 编程语言 » c语言中用递归方法求排列组合
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言中用递归方法求排列组合

发布时间: 2022-08-23 23:13:41

A. 在c语言中怎么设计排列组合的算法呢(请勿百度算法给我谢谢,我想知道怎么想得到这个算法)谢谢!

采用递归思路:假设有A1,A2,A3...An种元素
排列:
(1)把所有元素作为一个集合,可以拆分为一个元素+剩余元素的子集合,有n种拆法(A1/剩余元素,A2/剩余元素...An/剩余元素)
(2)把第一步中的子集合,按照(1)的思路进一步拆分,直到满足(3)
(3)当子集合中只有1种元素时,此时为Ax/Ay,排列就只有两种:Ax+Ay和Ay+Ax

组合:计算出排列后,组合就是:判断新生成的排列方案与之前的排列方案是否为同一种组合,比如Ax+Ay与Ay+Ax是不同的排列、是相同的组合

B. C语言中如何用递归的方法求从n个数中取m个数的排列组合的所有情况,其中n<m,要求写出完整的程序

典型的组合问题,解法有递归、回溯等等
递归法较简单,代码如下:

void combine(int a[], int n, int m, int b[], int M);

参数:
a 存放候选数字
n 总项数
m 取出项数
b 存放选出结果
M = m


#include"stdio.h"
#defineMAX100

voidcombine(inta[],intn,intm,intb[],intM);

intmain(void)
{
inti;
inta[MAX],b[MAX];

for(i=1;i<100;i++)
a[i-1]=i;

combine(a,5,4,b,4);
}

voidcombine(inta[],intn,intm,intb[],intM)
{
inti,j;

for(i=n;i>=m;i--)
{
b[m-1]=i-1;
if(m>1)
combine(a,i-1,m-1,b,M);
else
{
for(j=M-1;j>=0;j--)
printf("%d",a[b[j]]);
printf(" ");
}
}
}



其他方法可查阅相关资料。

C. C语言:用递归的方式对数组排序:

#include<stdio.h>
#defineN100
voidselection_sort(inta[],intlen);
intmain()
{
inta[N],i=0,len;
while(scanf("%d",&a[i])==1)
{
i++;
}
len=i;
selection_sort(a,len);
for(i=0;i<len;i++)
{
if(i==0)
printf("%d",a[i]);
else
printf("%d",a[i]);
}
printf(" ");
return0;
}
voidselection_sort(inta[],intlen)
{inti,j,t;
for(i=j=0;i<len;i++)
if(a[i]>a[j])j=i;
t=a[len-1];a[len-1]=a[j];a[j]=t;
if(len>1)selection_sort(a,len-1);
}

D. 求问C语言题目:排列组合(最好使用递归)

#include <stdio.h>

void swap(int &a,int &b)
{int c;
c=a; a=b; b=c;
}

void perm (int*list,int i,int n)
{
int j;
if(i==n)
{
for(j=0;j<=n;j++)
printf("%d",list[j]);
printf("\t");
}
else
{
for(j=i;j<=n;j++)
{
swap(list[i],list[j]);
perm(list,i+1,n);
swap(list[i],list[j]);
}
}
}

int main()
{int n;
int list[10]={1,2,3,4,5,6,7,8,9,0};
scanf("%d",&n);
perm(list,0,n-1);
return 0;
}

E. c语言编程排列组合

void Show(int n,int len ,char str[], char p[],int *i){/*函数功能说明: 密码穷举法 递归算法参数说明:len 密码可选元素的个数,实际等于 strlen(str); n 密码位数。 STR[]密码表。 *p 密码排列组合的临时存档*/int a;n--;for(a=0; a < len; a++){p[n]=str[a]; if(n==0)printf("%d:%s ",(*i)++,p); if(n0)Show(n,len , str,p,i);}} /*驱动程序 用于测试*/ int main(void){char str[]="abcdef";//密码表 可选元素集合可根据选择修改 int n=4;//密码位数,根据具体应用而定。 int len=strlen(str);//用于密码元素集合计数。 char p[20];//存放排列组合的密码,用于输出。 int num=0;//存放统计个数的整数值, int *i=&num;//计数器 地址。 p[n]='\0';//这个不用说啦。 printf("\n%d 位密码,每个密码有%d个选择的话,共有:%d个组合。\n",n,len,*i);return 0;}
以上回答你满意么?

F. C语言排列组合问题 用指针作为函数 采用递归

#include<stdio.h>
intn;
voidpai(intcur,int*a)
{
if(cur==n+1)
{
for(inti=1;i<=n;i++)
printf("%d",a[i]);
printf(" ");
return;
}
for(inti=1;i<=n;i++)
{
intok=1;
for(intj=1;j<cur;j++)
if(a[j]==i)
ok=0;
if(ok)
{
a[cur]=i;
pai(cur+1,a);
}
}
}
voidmain()
{
inta[15];
//排列的范围1~n
printf("请输入n:");
scanf("%d",&n);
pai(1,a);
}

G. c语言题目。输入一串字母。给出所有排列组合。用递归实现。只学了数组自定义函数。例如输入ab。打印ab.ba

void CalcAllPermutation_R(char perm[], int first, int num)
{
if (num <= 1) {
return;
}

for (int i = first; i < first + num; ++i) {
swap(perm[i], perm[first]);
CalcAllPermutation_R(perm, first + 1, num - 1);
swap(perm[i], perm[first]);
}
}
注意要理解算法的核心

H. C语言 求组合数,,用递归方法

举个例子 不太明白是什么组合数
补充======
说白了就是求阶乘
fun是阶乘函数
直接调用即可

#include <stdio.h>

long sum=0;//组合数结果
long fun(int i) //阶乘
{
If(n==1)
return 1 ; /*递归出口*/
else
return i*fun(i-1); /*递归体*/
}

long com(int n, int m)
{
sum=fun(m)/fun(n)*fun(m-n);
return sum;
}
int main(void)
{
int m=9,n=4;
printf("%l" , com(4,9));
return 0;
}

I. C语言 求此全排列递归算法解析

used数组是全局变量有隐含初值0;
关于全排列的算法你可以理解为深搜加回溯。
#include
#define
MAX
10
int
used[MAX];
//用来标记数字是否已经在前面使用过
int
result[MAX];
//存放结果
int
N;
void
print()
//输出结果
{
int
i;
for(i=0;i
printf("%d
",result[i]);
printf("\n");
}
void
proc(int
step)
//step用来记录已经摆好了几个数
{
int
i;
if(step==N)
//如果已经摆好了N个数,那么结果就产生了,就输出结果
print();
else
{
for(i=0;i
{
if(!used[i])
//没有使用过
{
used[i]=1;
//标记i已经使用
result[step]=i+1;
//记录结果
proc(step+1);
//递归求解
used[i]=0;
//这里就是所谓的回溯,也许比较难理解,你可以人工走一遍加深理解。其实回溯的主要想法是"还原现场".当执行到这一步时,i+1
这个数放在第step个位置的情况已经解决了,我们就要拿出i+1这个数,把它标记为未使用。
}
}
}
}
int
main()
{
scanf("%d",&N);
proc(0);
return
0;
}

J. C语言类问题.用递归法求从n个人中选择k个人组成一个委员会的不同组合数.

#include<stdio.h>
#include<stdlib.h>
intComb(intn,intk)
{
if(n==k||k==0)
return1;//边界值
else
returnComb(n-1,k)+Comb(n-1,k-1);
}
voidmain()
{
intn,k;
printf("请输入总人数n:");
scanf("%d",&n);
printf("请输入委员会人数k:");
scanf("%d",&k);
if(k<0||n<0||k>n)//输入数据的合法性判断
printf("输入不合法!");
else
printf("组合数有%d个!",Comb(n,k));
system("pause");
}