排列组合的实现(js描述)

组合的实现

排列组合描述和公式

犹记得高中数学,组合表示C(m, n),意思为从集合m,选出n个数生成一项,总共有多少个项的可能?组合是无序的,排列是有序的。所以排列的项数量多于组合

  • 排列A(n,m)=n×(n-1).(n-m+1)=n!/(n-m)!(n为下标,m为上标,以下同)
  • 组合C(n,m)=P(n,m)/P(m,m) =n!/m!(n-m)!

组合的实现

/**
 * 求:组合C(m, n),m为上标,n为下标。m选n的所有项
 * m {必传} 原始数据
 * n {必传} 当前项还需元素的个数
 * currentIndex 当前索引
 * choseArr 当前项的部分元素集合(不是完整项,是生成完整项的一个中间状态)
 * result 所有项的结果结合
 */
function cmn(m, n, currentIndex = 0, choseArr = [], result = []) {
    let mLen = m.length
        // 可选数量小于项所需元素的个数,则递归终止
    if (currentIndex + n > mLen) {
        return
    }
    for (let i = currentIndex; i < mLen; i++) {
        // n === 1的时候,说明choseArr在添加一个元素,就能生成一个新的完整项了。
        // debugger
        if (n === 1) {
            // 再增加一个元素就能生成一个完整项,再加入到结果集合中
            result.push([...choseArr, m[i]])
            // 继续下一个元素生成一个新的完整项
            i + 1 < mLen && cmn(m, n, i + 1, choseArr, result)
            break
        }
        // 执行到这,说明n > 2,choseArr还需要两个以上的元素,才能生成一个新的完整项。则递归,往choseArr添加元素
        cmn(m, n - 1, i + 1, [...choseArr, m[i]], result)
    }
    return result
}

// test 测试用例
var arr1 = ['a', 'b', 'c', 'd']
console.log('arr1111', cmn(arr1, 2))

应用领域

新高考高考选科,需要用到排列组合。。历史物理2选1。生物,化学,政治,地理4选2。

原文地址:https://www.cnblogs.com/damonFeng/p/12104100.html

时间: 2024-11-08 15:50:40

排列组合的实现(js描述)的相关文章

js 排列 组合 的一个简单例子

最近工作项目需要用到js排列组合,于是就写了一个简单的demo. 前几天在网上找到一个写全排列A(n,n)的code感觉还可以,于是贴出来了, 排列的实现方式: 全排列主要用到的是递归和数组的插入 比如12的全排列,首先把1拿出来放到elementCur,再获取由1组成的数组[2],然后在循环把1插入到0,1的位置后再返回1,2][2,1] 如果是123那么首先获取23的全排列[2,3][3,2],然后在插入1,[1,2,3][2,1,3][2,3,1][1,3,2][3,1,2][3,2,1]

JS排列组合

<script type="text/javascript"> function myfind(has, other, n) { if (n == 0) { document.write(has.join(",")); document.write("<br/>"); return; } if (other.length < n) { return; } var one = other.shift(); if (is

TODO:排列组合问题:n个数中取m个

排列组合是组合学最基本的概念.所谓排列,就是指从给定个数的元素中取出指定个数的元素进行排序.组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序.排列组合的中心问题是研究给定要求的排列和组合可能出现的情况总数. 排列组合与古典概率论关系密切. 本文示例实现的功能是"按顺序"从n个数中取m个数,如1,2,3,4,5,6取5个数字是:1,2,3,4,5:1,2,3,4,6:2,3,4,5,6.示例代码有javascript,php,golang,如果雷同,纯属学术研究,作为一种记

【程序员眼中的统计学(5)】排列组合:排序、排位、排

排列组合:排序.排位.排 作者 白宁超 2015年10月15日18:30:07 摘要:程序员眼中的统计学系列是作者和团队共同学习笔记的整理.首先提到统计学,很多人认为是经济学或者数学的专利,与计算机并没有交集.诚然在传统学科中,其在以上学科发挥作用很大.然而随着科学技术的发展和机器智能的普及,统计学在机器智能中的作用越来越重要.本系列统计学的学习基于<深入浅出统计学>一书(偏向代码实现,需要读者有一定基础,可以参见后面PPT学习).正如(吴军)先生在<数学之美>一书中阐述的,基于统

Exercise(16):排列组合

/* 排列组合 问题描述: 给定n个数,求出1,2,...,n的所有排列组合. (使用深度优先搜索算法) 输入描述 InputDescription 第一行输入整数n(0<n<=100) 输出描述 OutputDescr 每行n个用空格隔开的数,表示一种排列组合 样例输入 SampleInput 3 样例输出 SampleOutput 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 问题分析: 有n个数,抽象为n个盒子,每个盒子放1~n之中的一数. 1.在盒子一里放入1

算法练习:排列组合之子集合

问题描述 输入一个含有不同数字的序列,输出其所有子集合(含空集).要求:1)集合里元素有序排列:2)输出结果不含有重复集合 举例 输入序列{3,1,2} 输出:{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3} 问题分析 可以使用排列组合问题求解的第一种方法:分期摊还.初始化时,结果集合里含有一个空集.当扫描数列时,保留原有集合,同时将当前元素插入现有的所在集合中,从而形成新的集合.详见后面代码的GetSubSetsAmortized函数. 也可以使用第二种方法:f

HDU--5396(区间dp+排列组合)

做这道题的时候,想到会不会是dp,然后发现dp可做,但是一直被自己坑到死. 枚举最后合并的那个位置,然后对于加减号的,分成的前后两个部分都有不同的组合方法, (a1+a2........) +  (b1,b2.............)         对于每个a,被加b的个数的阶乘次 ,对于每个b,被加a的个数的阶乘次 减法同理 乘法特殊一点 (a1+a2........) *  (b1,b2.............)  乘法分配率,直接将两部分的总和相乘即可 想到这些还远远没有结束,因为最

排列组合

(常考)错位排列 有N封信和N个信封,每封信都不装在自己信封里的排列种数记作Dn,则 D1=0,D2=1,D3=2,D4=9,D5=44,D6=265 一.相邻问题---捆绑法 不邻问题---插空法 对于某几个元素不相邻的排列问题,可先将其他元素排好,再将不相邻元素在已排好的元素之间及两端空隙中插入即可. [例题1]一张节目表上原有3个节目,如果保持这3个节目的相对顺序不变,再添进去2个新节目,有多少种安排方法? A.20 B.12 C.6 D.4 [答案]A. [解析] 以下内容需要回复才能看

hdu 1799 (循环多少次?)(排列组合公式)

循环多少次? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3051    Accepted Submission(s): 1117 Problem Description 我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分.例如, 如果代码中出现 for(i=1;i<=n;i++) OP ; 那么做了n次OP运算