【算法】JavaScript必会算法 —— 排列组合(全排列)

文章目录


首先理解一下排列组合的定义:

  • 排列的定义:从 n n n个不同元素中,任取 m m m m ≤ n m≤n mn m m m n n n均为自然数,下同)个元素按照一定的顺序排成一列,叫做从 n n n个不同元素中取出 m m m个元素的一个排列;从 n n n个不同元素中取出 m ( m ≤ n ) m(m≤n) m(mn)个元素的所有排列的个数,叫做从 n n n个不同元素中取出 m m m个元素的排列数,用符号 A n m A_n^m Anm表示。此外规定 0 ! = 1 0!=1 0!=1
  • 计算公式: A n m = n × ( n − 1 ) × ( n − 2 ) × … × ( n − m + 1 ) = n ! ( n − m ) ! A_n^m=n\times(n-1)\times(n-2)\times…\times(n-m+1)= {n!\over(n-m)!} Anm=n×(n1)×(n2)××(nm+1)=(nm)!n!
  • 组合的定义:从 n n n个不同元素中,任取 m ( m ≤ n ) m(m≤n) m(mn)个元素并成一组,叫做从 n n n个不同元素中取出 m m m个元素的一个组合;从 n n n个不同元素中取出 m ( m ≤ n ) m(m≤n) m(mn个元素的所有组合的个数,叫做从 n n n个不同元素中取出 m m m个元素的组合数。用符号 C n m C_n^m Cnm表示。
  • 计算公式: C n m = A n m m ! = n ! m ! × ( n − m ) ! C_n^m={A_n^m\over m!}= {n! \over m! \times (n-m)!} Cnm=m!Anm=m!×(nm)!n!
  • 排列和组合的区别:看问题是否和顺序有关。有关就是排列,无关就是组合。
  • 排列组合_360百科

接下来进入正题:

在一个数组arr中四个元素,现需要得到它们全排列的结果:即如下图所示得到 A 4 4 = 4 × 3 × 2 × 1 = 24 A_4^4=4\times3\times2\times1=24 A44=4×3×2×1=24个结果

算法过程如图:
在这里插入图片描述
代码:

let func = (arr) => {let len = arr.lengthlet res = [] // 所有排列结果/*** 【全排列算法】* 说明:arrange用来对arr中的元素进行排列组合,将排列好的各个结果存在新数组中* @param tempArr:排列好的元素* @param leftArr:待排列元素*/let arrange = (tempArr, leftArr) => {if (tempArr.length === len) { // 这里就是递归结束的地方// res.push(tempArr) // 得到全排列的每个元素都是数组res.push(tempArr.join('')) // 得到全排列的每个元素都是字符串} else {leftArr.forEach((item, index) => {let temp = [].concat(leftArr)temp.splice(index, 1)// 此时,第一个参数是当前分离出的元素所在数组;第二个参数temp是传入的leftArr去掉第一个后的结果arrange(tempArr.concat(item), temp) // 这里使用了递归})}}arrange([], arr)return res
}
console.log('结果:', func(['A', 'B', 'C', 'D']))

在这里插入图片描述
在这里插入图片描述

摘自极客时间王争老师的《数据结构与算法之美》专栏:

  • 写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。
  • 编写递归代码的关键是,只要遇到递归,我们就把它抽象成一个递推公式,不用想一层层的调用关系,不要试图用人脑去分解递归的每个步骤。
  • 轻松理解全排列算法的递归解法_jiaobuchong的专栏-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/350180.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C++:排列组合算法

转载请注明出处 1 介绍 排列(Permutation)和组合(Combination)是两个基础的数学概念。 计算排列与组合可以解决一些实际的工程问题,掌握排列组合计算的方法是十分重要的。 目前,网上已经有一些计算排列…

排列组合公式及排列组合算法

排列组合公式 排列组合公式/排列组合计算公式 公式P是指排列,从N个元素取M个进行排列。 公式C是指组合,从N个元素取M个进行组合,不进行排列。 N-元素的总个数 M参与选择的元素个数 !-阶乘,如 9!&#xf…

排列组合公式/排列组合计算公式

排列组合公式/排列组合计算公式 公式P是指排列,从N个元素取M个进行排列。 公式C是指组合,从N个元素取M个进行组合,不进行排列。 N-元素的总个数 M参与选择的元素个数 !-阶乘,如9!=9*8*7*6*5…

详细总结组合排列的十余种算法实现

目录 •写在前面 •问题引入 •暴力枚举 循环枚举 递归枚举 回溯枚举 •深度优先搜索 前序遍历 中序遍历 后序遍历 •字典序 •二进制位运算 •带重复数字 •总结 •写在前面 排列组合的问题,如果没有合适的算法去解决,时间复杂度会相当的…

论坛的头像

做了个论坛的头像,相当的简单 也就只能看看啦 菜啊

论坛头像编辑 html,spu头像编辑.html

SPU头像编辑 $axure.utils.getTransparentGifPath function() { return resources/images/transparent.gif; }; $axure.utils.getOtherPath function() { return resources/Other.html; }; $axure.utils.getReloadPath function() { return resources/reload.ht…

牛客网项目---1.7.账号设置(上传头像、修改密码)

7、账号设置/setting 上传头像将头像保存到本地/七牛云服务器,随机生成字符串作为图片的名称,表单提交再返回该界面。获取头像时,在本地获取,通过输入输出流,先读到缓冲区,再从缓冲区写出;在七…

Discuz论坛无法上传头像/ 企业邮箱被归为垃圾邮件的问题

背景: 安装了Discuz论坛程序,更改个人头像的时候,点击上传按钮没有反应基于阿里云企业邮箱配置了论坛的邮件发送服务,但是邮箱被列入垃圾邮件拒收 解决方法: 上传头像失败:ucenter和全局域名要加https&a…

flask更改用户头像

目录结构图: 配置app 导包及配置 import os from flask import Flask, flash, request, redirect, url_for,Request,render_template from werkzeug.utils import secure_filenameUPLOAD_FOLDER 文件下载的绝对路径 # 允许的下载类型 ALLOWED_EXTENSIONS {txt, pdf, png, j…

discuz论坛用户--设置--修改头像不显示的解决方法

本文参考:https://www.2cto.com/kf/201601/478810.html 和https://jingyan.baidu.com/article/ceb9fb10ab73b68cad2ba092.html 先登陆discuz管理员后台admin.php,找到“站长”>>“UCenter设置”,其它的默认的地方就不要动了。关键要改…

关于Discuz 出现上传头像失败的问题

今天测试了论坛上传头像时出现 网上大部分的解决方案是配置UCenter Access denied for agent changed 头像无法更新 配置文件: config下config_global.php,config_ucenter.php uc_server\data下的config.inc.php 具体可参考此处:Discuz配…

内部论坛系统

开发环境/技术: Linux,MyEclipse,JDK1.7,MySql,JS,jQuery, ajax,Tomcat,CSS样式,Struts框架等 项目描述/功能: 项目主要实现了用户登陆注册&#…

Vue 彩色头像|一个有趣的头像生成器 附源码

前言 这是一款矢量风格的头像生成器,您可以搭配不同的素材组件,生成属于您自己的个性化头像。 介绍 您可能感兴趣的功能: 可视化组件配置栏随机生成头像重做/撤消国际化批量生成多个头像 在线体验 Vue 彩色头像https://www.shserve.cn/…

PHP 头像上传到mysql数据库

准备环境 window2008 phpStudy Mysql数据库 mysql数据库 第一步&#xff1a;用户登录成功 该用户已经存在数据库 进入个人中心&#xff0c;查找到数据库中的个人信息 进行图片上次 <?php include "../mysqlcon/dblink.php"; //导入数据库 ?><html> …

用php做论坛头像代码,详细介绍PHP针对多用户实现头像更换代码示例

一个网站&#xff0c;其实说白了就是某几个特定功能的组合&#xff0c;而更换用户头像就在这些功能之中。今天就来做个测试&#xff0c;针对不同的用户&#xff0c;实现头像上传功能。 成品图 思路针对不同的用户上传头像&#xff0c;我们要为每一个已登录的用户创建一个文件夹…

教你用go freetype根据用户昵称生成头像

最近需要为用户服务添加一些新功能&#xff0c;其中就包括在注册时根据用户昵称生成头像这一点。 由于用户服务是用golang写的&#xff0c;google来google去都只找到freetype一个比较简单好用的库&#xff0c;其他比如ImageMagicK之类api都过于低层不适合我们这样相对简单的图…

java ajax 更改头像_ajax+node实现头像更改

好久没有更新博客了&#xff0c;这几天在写文件上传的时候遇到了一个新的问题&#xff0c;就是关于ajax实现文件上传的问题 这几天在做一个小的demo&#xff0c;类似于论坛的一个东西&#xff0c;基于jqueryexpressmongo的一个小的案例&#xff0c;在做到关于设置个人头像的时候…

DISCUZ论坛插件h5手机电脑头像上传3.7.1带扩展插件【收集免费分享】

一个支持电脑和手机h5技术头像上传的插件。 说明&#xff1a;本插件h5电脑版和h5手机版为自主全新开发的触屏版头像上传&#xff0c;体验好&#xff0c;性能好&#xff0c;绿色。 主要特点&#xff1a;支持H5电脑版和H5手机版头像上传。 支持鼠标和触屏操作&#xff0c;支持图…

discuz 头像html5上传,discuz更新H5头像上传

越来越多的浏览器可以慢慢的不在支持flash,对应一些discuz论坛的老的版本来说就需要进行升级操作了,接下来吾爱编程为大家介绍一下discuz头像上传flash改为h5上传的方法,有需要的小伙伴可以参考一下: 1、准备工作: 根据自己的网站编码格式下载对应的最新的版本代码,然后解…

DISCUZ 如何为主题帖列表页添加头像,显示发帖者头像

只显示名字的代码 <em style" font-size:14px;"><!--{if $thread[authorid] && $thread[author]}--><a href"home.php?modspace&uid$thread[authorid]" c"1"{if $groupcolor[$thread[authorid]]} style"color…