JavaScript如何实现元素全排列实例代码


Posted in Javascript onMay 14, 2019

排列 (Permutation / Arrangement)

概念

n 个不同元素中任意选取 m (m <= n) 个元素进行排列,所有排列情况的个数叫做 排列数,其值等于:

A = n! / (n - m)!

! 表示数学中的阶乘运算符,可以通过以下函数实现:

function factorial(n) {
 if (n === 0 || n === 1) {
 return 1;
 
 } else if (n < 0) {
 return null;
 
 } else {
 return n * factorial(n - 1);
 }
}

console.log(factorial(4)); // 24

当 n = m 时,称为 全排列,其值等于:

A = n!

全排列相当于将所有元素进行排序,得到所有不同顺序情况的个数;

分析

利用阶乘函数,通过上述数学公式只能得到所有情况的个数值,不容易得到具体的每种情况,要获取每种情况的输出值的话需要另寻他法;

用数组举例分析:

全排列:

    [1, 2, 3] => [             
                    [1, 2, 3],
                    [1, 3, 2],
                    [2, 1, 3],
                    [2, 3, 1],
                    [3, 1, 2],
                    [3, 2, 1]
                 ]
               
                共 6 种情况

    树状图表示:
   
      1       2       3
     / \     / \     / \
    2   3   1   3   1   2
    |   |   |   |   |   |
    3   2   3   1   2   1   =>  6

3 个元素中选取 2 个时:(n = 3, m = 2)

    [1, 2, 3] => [             
                    [1, 2],
                    [1, 3],
                    [2, 1],
                    [2, 3],
                    [3, 1],
                    [3, 2]
                 ]
               
                共 6 种情况
   
    树状图表示:
   
      1       2       3
     / \     / \     / \
    2   3   1   3   1   2   =>  6

实现

let arr = [1, 2, 3];

/*
参数 a 为输入数组,
元素个数 n 为 a 的长度,
选取个数为 m;
*/
function permutation(a, m) {

 // 保存最终输出结果
 let result = [];
 
 // 定义 m 值默认等于 n,即全排列
 let n = a.length;
 m = m || n;
 
 // 定义递归函数保存结果到数组中
 // _a 为输入数组,
 // tmpResult 为保存单个情况结果的数组
 function recur(_a, tmpResult = []) {
 if (tmpResult.length === m) {
 
  // 结果达到 m 个时保存结果,
  // 停止递归并进入下一次遍历
  result.push(tmpResult);
  
 } else {
  for (let i = 0; i < _a.length; i++) {
  
  // 复制一份输入数组,防止引用值被改变
  let tmpA = _a.concat();
  
  // 复制一份保存结果的数组,防止每次遍历相互影响
  let _tmpResult = tmpResult.concat();
  
  // 保存当前遍历值
  _tmpResult.push(tmpA[i]);
  
  // 删除当前遍历值,传递参数进入下一层递归
  tmpA.splice(i, 1);
  recur(tmpA, _tmpResult);
  }
 }
 }
 
 // 开始执行递归,然后返回最后结果
 recur(a);
 return result;
}

console.log(permutation(arr));
// 3 个数全排列:
/*
[  
 [1, 2, 3], 
 [1, 3, 2], 
 [2, 1, 3], 
 [2, 3, 1], 
 [3, 1, 2], 
 [3, 2, 1]
]
*/

console.log(permutation(arr, 2));
// 3 个数中选取 2 个数排列:
/*
[  
 [1, 2], 
 [1, 3], 
 [2, 1], 
 [2, 3], 
 [3, 1], 
 [3, 2]
]
*/

最终实现函数就是 permutation(a, m),其中参数 a 为输入数组,包含需要排列的所有元素,参数 m 为选取需要排列的个数,默认等于输入数组的长度,即默认全排列,注意 m 不能大于元素个数;

拓展

以上函数输出值为一个二维数组,如果需要便于观察,输出一个一维数组,可以定义一个合并函数:

function merge(arr) {
 return arr.map(x => x.join(''));
}

let result = merge(permutation([1, 2, 3]));
console.log(result);
// [123, 132, 213, 231, 312, 321]

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JS 的应用开发初探(mootools)
Dec 19 Javascript
关于jquery input textare 事件绑定及用法学习
Apr 03 Javascript
jquery对dom的操作常用方法整理
Jun 25 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
Oct 24 Javascript
深入理解JavaScript是如何实现继承的
Dec 12 Javascript
JQuery中serialize()、serializeArray()和param()方法示例介绍
Jul 31 Javascript
JQuery控制radio选中和不选中方法总结
Apr 15 Javascript
JavaScript中的Function函数
Aug 27 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
Sep 13 Javascript
javascript 组合按键事件监听实现代码
Feb 21 Javascript
angular第三方包开发整理(小结)
Apr 19 Javascript
VuePress 静态网站生成方法步骤
Feb 14 Javascript
微信小程序实现多选框全选与取消全选功能示例
May 14 #Javascript
js中arguments对象的深入理解
May 14 #Javascript
ios中视频的最后一桢问题解决
May 14 #Javascript
详解可以用在VS Code中的正则表达式小技巧
May 14 #Javascript
vue项目中引入vue-datepicker插件的详解
May 14 #Javascript
JQuery获取可视区尺寸和文档尺寸及制作悬浮菜单示例
May 14 #jQuery
JavaScript中this的全面解析及常见实例
May 14 #Javascript
You might like
PHP 采集心得技巧
2009/05/15 PHP
zf框架的session会话周期及次数限制使用示例
2014/03/13 PHP
PHP中的命名空间详细介绍
2015/07/02 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
批量下载对路网图片并生成html的实现方法
2016/06/07 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
JavaScript方法_动力节点Java学院整理
2017/06/28 Javascript
vue路由跳转时判断用户是否登录功能的实现
2017/10/26 Javascript
vue中本地静态图片路径写法
2018/03/06 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
2020/03/23 Javascript
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
2018/12/15 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
DjangoWeb使用Datatable进行后端分页的实现
2020/05/18 Python
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
英国领先的瓷砖专家:Walls and Floors
2018/04/27 全球购物
印度首个本地在线平台:nearbuy
2019/03/28 全球购物
英国水族馆和池塘用品购物网站:Warehouse Aquatics
2019/08/29 全球购物
英国时尚泳装品牌:Maru Swimwear
2019/10/06 全球购物
微软马来西亚官方网站:Microsoft马来西亚
2019/11/22 全球购物
应届生高等护理求职信
2013/10/12 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书
个人买房协议书范本
2014/10/06 职场文书
小学教师读书笔记
2015/07/01 职场文书
Django中的JWT身份验证的实现
2021/05/07 Python
python中pd.cut()与pd.qcut()的对比及示例
2022/06/16 Python
Win10玩csgo闪退如何解决?Win10玩csgo闪退的解决方法
2022/07/23 数码科技