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实现ASP分页函数 HTML分页函数
Sep 22 Javascript
克隆javascript对象的三个方法小结
Jan 12 Javascript
javascript中window.event事件用法详解
Dec 11 Javascript
jquery indexOf使用方法
Aug 19 Javascript
JQuery显示、隐藏div的几种方法简明总结
Apr 16 Javascript
利用JavaScript阻止表单提交的两种方法
Aug 11 Javascript
jquery.validate表单验证插件使用方法解析
Nov 07 Javascript
基于JavaScript实现右键菜单和拖拽功能
Nov 28 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
Nov 28 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
Jul 18 Javascript
微信小程序引入VANT组件的方法步骤
Sep 19 Javascript
Vue实现腾讯云点播视频上传功能的实现代码
Aug 17 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+Ajax无刷新带进度条图片上传示例
2017/02/08 PHP
PHP中include和require的区别实例分析
2017/05/07 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
Lumen timezone 时区设置方法(慢了8个小时)
2018/01/20 PHP
实例讲解PHP验证邮箱是否合格
2019/01/28 PHP
javascript(jquery)利用函数修改全局变量的代码
2009/11/02 Javascript
javascript getElementsByClassName函数
2010/04/01 Javascript
利用jQuery的deferred对象实现异步按顺序加载JS文件
2013/03/17 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
js中top的作用深入剖析
2014/03/04 Javascript
浅析JavaScript事件和方法
2015/02/28 Javascript
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
详解http访问解析流程原理
2017/10/18 Javascript
vue实现城市列表选择功能
2018/07/16 Javascript
微信小程序倒计时功能实例代码
2018/07/17 Javascript
js实现星星打分效果
2020/07/05 Javascript
JS removeAttribute()方法实现删除元素的某个属性
2021/01/11 Javascript
python模拟登陆Tom邮箱示例分享
2014/01/13 Python
python中快速进行多个字符替换的方法小结
2016/12/15 Python
Python爬虫DOTA排行榜爬取实例(分享)
2017/06/13 Python
Python爬虫实现全国失信被执行人名单查询功能示例
2018/05/03 Python
数据清洗--DataFrame中的空值处理方法
2018/07/03 Python
使用Python实现租车计费系统的两种方法
2018/09/29 Python
PyQt5根据控件Id获取控件对象的方法
2019/06/25 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
python 从list中随机取值的方法
2020/11/16 Python
Champion澳大利亚官网:美国冠军运动服装
2018/05/07 全球购物
教师研修随笔感言
2014/01/23 职场文书
五四青年节优秀演讲稿范文
2014/05/28 职场文书
运动会广播稿诗歌版
2014/09/12 职场文书
运动会跳远广播稿5篇
2014/09/17 职场文书
镇人大副主席民主生活会对照检查材料思想汇报
2014/10/01 职场文书
600字作文之感受大自然
2019/11/27 职场文书
php png失真的原因及解决办法
2021/10/24 PHP
分享几种python 变量合并方法
2022/03/20 Python
PyTorch中permute的使用方法
2022/04/26 Python