当前位置:首页 » 操作系统 » 排列组合的递归算法

排列组合的递归算法

发布时间: 2022-05-05 08:18:24

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(" ");
}
}
}



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

② 排列组合中c53是怎么算的,5在下,3在上

C(5,3)=C(5,2)=5*4/2*1=20/2=10

1、从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。

2、在线性写法中被写作C(n,m)。组合数的计算公式为

即从m个不同元素中取出n个元素的组合数=从m个不同元素中取出 (m-n) 个元素的组合数;

这个性质很容易理解,例如C(9,2)=C(9,7),即从9个元素里选择2个元素的方法与从9个元素里选择7个元素的方法是相等的。

规定:C(n,0)=1 C(n,n)=1 C(0,0)=1

参考资料


网络-组合数

③ 排列组合中A和C怎么算啊

1、排列组合中,组合的计算公式为:

④ c语言 排列组合 程序算法

#include<stdio.h>
#include<string.h>
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(n>0)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=#//计数器
地址。
p[n]='\0';//这个不用说啦。 Show(
n,len
,str,
p
,i);
printf("\n%d
位密码,每个密码有%d个选择的话,共有:%d个组合。\n",n,len,*i); return
0;
}

⑤ 排列组合算法,要求从一堆数中任取m个数组合使得m个数的和最接近某个数

典型的组合问题,解法有递归、回溯等等递归法较简单,代码如下: void combine(int a[], int n, int m, int b[], int M); 参数:a 存放候选数字n 总项数m 取出项数b 存放选出结果M = m

#include "stdio.h"#define MAX 100 void combine(int a[], int n, int m, int b[], int M); int main(void){ int i; int a[MAX], b[MAX]; for (i = 1; i < 100; i++) a[i - 1] = i; combine(a, 5, 4, b, 4);} void combine(int a[], int n, int m, int b[], int M){ int i, 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("\n"); } }}

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

⑥ 全排列算法(掺杂了递归)理解不了,帮忙看看

解释:

int p[]; // 用来存放参与排列组合的数据的数组(有效元素下标从 1 到 n)

int n; // 参与排列组合的数据的个数


void perm(int m){……}

// 用来进行局部排列组合的函数

// 其中的 m 表示本轮局部排列组合的起点,即,将数组中 m 到 n 的元素进行排列组合

// 但是如果 m==n 则表示已经完成了一个排列组合,所以输出一个排列组合结果。


程序注释:

voidperm(intm){
intj,temp;//j循环中要处理的元素下标,temp交换数据时要用到的临时变量

if(m==n)//如果需要进行局部排列组合的数据就只是最后一个数据
{
//那么不需要再进行局部排列组合了,
//直接输出数组中的所有数据,得到了一个排列结果。
for(j=1;j<=n;j++)
printf("%d",p[j]);//输出每一个数据
printf(" ");//追加一个换行符
return;//本轮局部排列组合结束
}


//保持m号元素之前的数据不变,
//将m到n的元素进行局部排列组合。
for(j=m;j<=n;j++)
{
temp=p[m];p[m]=p[j];p[j]=temp;//将m到n的元素逐个交换到m位置上
perm(m+1);//再对m之后的部分进行局部排列组合。
temp=p[m];p[m]=p[j];p[j]=temp;//把以前在m位置上的数据交换回来
}
}

比如要对 1,2,3,4,5 进行全排列组合


先从 1,2,3,4,5 中,每次选出一个作为第一个数

然后再从其余的数字中,每次选出一个作为第二个数

然后再从其余的数字中,每次选出一个作为第三个数

然后再从其余的数字中,每次选出一个作为第四个数

再将最后剩下的数据作为第五个数

⑦ 排列组合算法

可用递归算法 实现N重循环 来实现
详细请QQ :115499275
以下也许有助于你
以下为文件<Form1.frm>的内容:
VERSION 5.00
Begin VB.Form Form1
Caption = "Form1"
ClientHeight = 8115
ClientLeft = 60
ClientTop = 345
ClientWidth = 5760
LinkTopic = "Form1"
ScaleHeight = 8115
ScaleWidth = 5760
StartUpPosition = 3 '窗口缺省
Begin VB.ComboBox Combo1
Height = 300
Left = 4200
TabIndex = 2
Text = "Combo1"
Top = 960
Width = 1215
End
Begin VB.TextBox Text1
Height = 7455
Left = 120
MultiLine = -1 'True
ScrollBars = 2 'Vertical
TabIndex = 1
Text = "Form1.frx":0000
Top = 120
Width = 3855
End
Begin VB.CommandButton Command1
Caption = "Command1"
Height = 495
Left = 4200
TabIndex = 0
Top = 120
Width = 1215
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim Pwd As String

Function NFormM(ByVal iStart As Integer, iEnd As Integer, Num As Integer, Optional Str As String)
Dim i As Integer
If Num = 0 Then
With Text1
.Text = Text1.Text & Str & vbNewLine
.SelStart = Len(.Text)
End With
Else
For i = iStart To iEnd
DoEvents
NFormM i + 1, iEnd, Num - 1, Str & Mid(Pwd, i, 1)
Next
End If
End Function

Private Sub Command1_Click()
Dim out(), i As Integer, s As String
Text1.Text = ""
NFormM 1, Len(Pwd), Val(Combo1.Text)
End Sub

Private Sub Form_Load()
Dim i As Integer
With Combo1
For i = 1 To 12
.AddItem i
Pwd = Pwd & Chr(64 + i)
Next
Print Pwd
End With
End Sub

⑧ 设计递归算法生成n个元素的所有排列对象

#include<iostream>
#include<iterator>
#include<algorithm>
using namespace std;

template<class T>
void permutation(T list[], int k, int m)
{
if (k == m)
{
(list, list + m + 1, ostream_iterator<T>(cout, "")); //将当前list排序
cout << endl;
}
else{
for (int i = k; i <= m; i++)
{
swap(list[i], list[k]); //将下标为i的元素交换到k位置,类似从list[k:m]中剔除操作
permutation(list, k + 1, m);
swap(list[i], list[k]);
}
}
}

int main(int argc, char* argv[])
{
char arr[3] = { 'a', 'b', 'c' };
cout << "排序结果如下:" << endl;
permutation(arr, 0, 2);
return 0;

}

(8)排列组合的递归算法扩展阅读

递归,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。也就是说,递归算法是一种直接或者间接调用自身函数或者方法的算法。

通俗来说,递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。

递归的基本原理

第一:每一级的函数调用都有自己的变量。

第二:每一次函数调用都会有一次返回。

第三:递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序。

第四:递归函数中,位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反。

第五:虽然每一级递归都有自己的变量,但是函数代码并不会得到复制。

⑨ 关于排列组合的一些算法编程问题

#include <stdio.h>

void delect(int n,int *p)

{

int i,j=0,k,a[n],b[n];

int temp[10]={1,2,3,4,5,6,7,8,9,10};

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

a[i]=*(p+i);


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

for(j=0;j<10;j++)

if(a[i]==temp[j])

temp[j]=-1;

for(i=0,j=0;i<10;i++)

if(temp[i]>0)

b[j++]=temp[i];


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

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

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

printf("(%d,%d,%d) ",b[i],b[j],b[k]);

}


main()

{

int a[10],i,j,k,N;

int *p=a;

printf("how much nums:");

scanf("%d",&N);

printf("input nums:");

for(i=0;i<N;i++)

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

for(i=0;i<N;i++)

for(j=i+1;j<N;j++)

for(k=j+1;k<N;k++)

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

//for(i=0;i<N;i++) printf("%d",*(p+i));

printf(" delect ");

delect(10-N,p);

}

⑩ 在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是不同的排列、是相同的组合

热点内容
mysql上传图片php 发布:2024-10-07 04:13:31 浏览:852
手游喊话脚本 发布:2024-10-07 03:53:53 浏览:232
maven3编译jdk6项目 发布:2024-10-07 03:19:57 浏览:45
缓存的视频无法剪辑 发布:2024-10-07 03:19:40 浏览:89
解压工具RAR 发布:2024-10-07 02:42:49 浏览:353
苹果网盘解压 发布:2024-10-07 02:42:49 浏览:160
为什么安卓苹果手游不互通 发布:2024-10-07 02:31:28 浏览:280
如何删除手机中的游戏缓存 发布:2024-10-07 02:11:28 浏览:876
解锁数据库用户 发布:2024-10-07 01:55:54 浏览:828
关系数据库的关键字是指 发布:2024-10-07 01:55:54 浏览:519