如何编写从M中选N的组合数程序,一个不用递归方法设计,一个用递归方法设计

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
     看到有人写帖子问如果从m个数组中取N个原始的算法,要求一个是递归的,一个不是递归的。
递归的解法:(比较笨)
void getn(int a[], int b[] , int m, int n, int index,int lastindex)
{
        
int i = lastindex + 1;
        
if(index == n )
        {
                
int x;
                
for(x = 0 ; x  < n ;x ++)
                {
                        printf(
" %d ",a[b[x]]);
                }
                printf(
" ");
                
return ;
        }
        
while( i  < m)
        {
                b[index] 
= i;
                getn(a,b,m,n,index 
+ 1,i);
                i 
++ ;
        }

 非递归的解法:
 
void agen(int a[],int m, int n) /* from m get n */
{
        
int i ,j  ;
        
int b[100= {0}; /* big then n */
        i 
= j = 0;
        
while(b[0]  < m ) {
                
while( i  < m) {
                        
if(j == n - 1 ) {
                                
int x ;
                                
for( x = 0 ; x  < n ; x ++) {
                                        printf(
" %d ",a[b[x]]);
                                }
                                printf(
" ");
                        } 
else {
                                j 
++;
                        }
                        i 
++;
                        b[j] 
= i;

                }
                
do {
                        j 
--;
                        b[j] 
++ ;
                } 
while(b[j] >= m );
                i 
= b[j] ;
        }

  测试的主程序:

int main()
{
        int a[10] = {0, 1,2,3,4,5,6,7,8,9};
        int b[20] ={0};
        getn(a,b,10,5,0,-1);
        agen(a,10,5);
        return 0;
}
Python快速求组合数C(n,m)三种方法整理 百度百科对于组合数的定义是:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。 由于经常遇到一些组合数问题,所以整理一下常见的快速求组合数方法,附上Python的实现代码。 一、m,n不是特别大的时候: (nm)=n!m!∗(n−m)!\binom {n}... 阅读详情

相关推荐

组合数计算C(n,m)加取模情况

想法:以前做比赛的时候遇到很多需要计算组合数的情况,都是当时手敲的,写递归不是暴就是超时啥的,或者是因为要取模,然后还要求逆元,所以敲得不是慢就是老是出问题,所以现在搞出模板来以后用就快了。 一:线性求C(n,m) 解释:由HDU 4927这道题求的组合数,可以了解到组合数的一些递推快速求法,因为这道题就是卡组合数的时间的。如果我们要算C(10,4),我们可以先算C(10,1),再算C(10,

liwei的专栏 2701

实现从M个字符中选择N个字符的递归程序

实现从M个字符中选择N个字符的递归程序

N选M的所有组合(递归非递归实现)

此代码实现从N个数字中取出M个数字的所有组合,有两种实现方法递归方法非递归方法

从M个不同的整数中,选择N个出来排列

#include using namespace std; #define N 3 #define M 5 //从M个不同元素中选取N个出来排列 int x[N]; int element[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; bool map[M]; //map[i] 为true表示element[i]可用,反之不可用 int count = 0

Manketon的专栏 891

排列组合

小比琪的屁屁 排列 组合 排列有顺序,组合没顺序;就是这么简单!!公式 很好理解的 1:从m中选n个,假设m个中有一个是x,所有的情况就可分为选x和不选x,对于选x的情况,就相当于从m-1个里选n-1个,对于不选x的情况,就相当于从m-1里选n个 2:c(n,m)=c(m-n,m)(假设选为涂红色,不选为涂白色) 从m个里选n个的涂红色总情况数等于从m个里选m-

pcccccccccc的博客 666

每日一算法:m元素中取n个元素(高效算法)

个数种取三个 1 1 1 0 0   1 2 3 1 1 0 1 0   1 2 4 1 0 1 1 0   1 3 4 0 1 1 1 0   2 3 4 1 1 0 0 1   1 2 5 1 0 1 0 1   1 3 5 0 1 1 0 1   2 3 5 1 0 0 1 1   1 4 5 0 1 0 1 1   2 4 5 0 0 1 1 1   3 4 5

Python3 爬虫实战 1:应对特殊字体,爬取猫眼电影实时排行榜 2877

c++:从m个数的序列中选取n个数

算法通常用于排列,一个递归就可以实现。 需要的变量如下: int n,k; //n为原数组元素个数,k为选取元素个数 int x[20]; //原数组 int flag[20]; //原数组标志位,为1则表示此位置元素已被选取 int c[20]; //保存已被选取的元素下标 递归搜寻子序列的函数如下: void arr(int index) { if(index==k-1) //如果已经找到了k个数 { save(c);

qq_41617884的博客 3557

N选M组合算法非递归Java实现

组合算法: 组合就是从N个数中选M个数的所有组合。(N>=M),输出格式按照数字的递增顺序输出。 最简洁的实现一般都是利用递归的思想,或者更具体说是使用深度优先搜索算法来解决。 今天来用非递归的方式,解决这个经典问题。直接上代码: import java.util.Scanner; import java.util.Stack; public class DepthFirst { private static void printstack(Stack<Integer&gt.

qiongqiong421122的专栏 1289

一个递归程序,计算组合数

一个递归程序,计算: #include<stdio.h> int recur(int m,int n){ if(n==0) return 1; if(n==1) return m; if(m<2*n)return recur(m,m-n); else return recur(m-1,n)+recur(m-1,n-1); } int main(){ int a,b; scanf("%d %d",&a,&b); pr

JC_ZQ_Fighting的博客 1246

Java编程实现用递归程序计算组合数 , 其中整数n,m(m≤n≤20)由键盘输入.

运行效果: 代码: public class Group { public static void main(String[] args) { System.out.print("请输入n:"); Scanner sc = new Scanner(System.in); int n = sc.nextInt(); System.out.print("请输入m:"); ...

weixin_41879980的博客 946

从n个数中选出m个数的组合

找出从自然数1,2,3,…,n中任取m个数的所有组合。例如:n=5,m=3时,所有组合为543,542,541,532,531,521,432,431,421,321。 #include<iostream> #include<cstdio> #define N 4 //被选择的数目 #define M 2 //要选出来的数目 using namesp...

summer2day的博客 5462

组合数递归求阶层)

本题要求编写程序,根据公式C​n​m​​=​m!(n−m)!​​n!​​算出从n个不同元素中取出m个元素(m≤n)的组合数。 建议定义和调用函数fact(n)计算n!,其中n的类型是int,函数类型是double。 输入格式: 输入在一行中给出两个正整数m和n(m≤n),以空格分隔。 输出格式: 按照格式“result = 组合数计算结果”输出。题目保证结果在double类型范围内。 ...

纸短情长的博客 2988

打印从n个数中选取m个数组合数

打印从n个数种选取m个数组合数 方法一:利用递归思想。 [cpp] view plaincopy //从后往前选取,选定位置i后,再在前i-1个里面选取m-1个。   //如 1 2 3 4 5 中选取 3 个   //1、选取5后,再在前4个里面选取2个,而前4个里面选取2个又是一个子问题,递归即可。   //2、如果不包含5,直接选定4,那

deadcodeye的专栏 1566

本题要求编写程序,根据公式​​算出从n个不同元素中取出m个元素的组合数

本题要求编写程序,根据公式C​n​m​​=​m!(n−m)!​​n!​​算出从n个不同元素中取出m个元素(m≤n)的组合数

ProceduralMan的博客 9196

(习题3)编写一个函数fun,求p=m!/n!(m-n)!的值,其中m与n为两个正整数,且要求m>

任务: 编写一个函数fun,求p=m!/n!(m-n)!的值,其中m与n为两个正整数,且要求m&amp;gt; #include &amp;lt;stdio.h&amp;gt; int fac(int n); int fun(int m, int n); void main() { int m, n; while (1) { scanf_s(&quot;%d%d&quot;, &amp;amp;m, &amp;amp;n

Dramatic的博客 2万+

计算组合数C(n,m)

计算组合数C(n,m) Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 C(n,m)=n!/(m! * (n-m)!).(0 输入 第一行是一个正整数t,下面t行每行有两个整数n和m。 输出 对于每一行输入,分别对应输出组合数C(n,m)的值 示例输入 3 1 1 2 1 3 2 示

颤抖的羽翼 7033

递归求既阶乘求m n的组合数

第2周报告2:  实验目的:用递归求既阶乘求m n的组合数 程序的版权和版本声明部分* Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved.* 文件名称:  * 作 者:石丽君  * 完成日期: 2012年 2月27 日*  版 本 号: * * 算法设计 #include using namespace std;

shitoujianqiang123的专栏 1568

已知计算组合的公式如下,用递归算法写出一个计算组合Cmn的值的函数zh(m,n),并写出主函数调用该函数。

已知计算组合的公式如下,用递归算法写出一个计算组合Cmn的值的函数zh(m,n),并写出主函数调用该函数。 输入 两个整数 m,n(m>=n) 输出 组合值 https://img03.sogoucdn.com/app/a/100520146/e53b9637b7931d9d1206a22a34ba06ed 样例输入 4 2 样例输出 6 #include <stdio.h> #include <string.h> #include <math.h> #inc

xuchaoxin1375的博客 4798

求排列组合数c(n,m),用递归方法

本文会提供两种方法:直接递归和间接递归

shen_ye_的博客 1194
上一篇: 数组求和的一个解法
下一篇: AES 加密算法的 C 语言实现
free2o
博客等级 码龄19年 59粉丝 97原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值