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 相关文章推荐
Mootools 1.2教程 滑动效果(Slide)
Sep 15 Javascript
jQuery 标题的自动翻转实现代码
Oct 14 Javascript
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
May 06 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
Sep 03 Javascript
jquery插件制作 自增长输入框实现代码
Aug 17 jQuery
JQuery异步加载无限下拉框级联功能实现示例
Feb 19 Javascript
jQuery简单实现彩色云标签效果示例
Aug 01 Javascript
基于jQuery实现表格的排序
Dec 02 Javascript
分享JS表单验证源码(带错误提示及密码等级)
Jan 05 Javascript
5个你不知道的JavaScript字符串处理库(小结)
Jun 01 Javascript
Vue执行方法,方法获取data值,设置data值,方法传值操作
Aug 05 Javascript
Vue-Element-Admin集成自己的接口实现登录跳转
Jun 23 Vue.js
微信小程序实现多选框全选与取消全选功能示例
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
全国FM电台频率大全 - 15 山东省
2020/03/11 无线电
php对csv文件的读取,写入,输出下载操作详解
2013/08/10 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
PHP微信开发之有道翻译
2016/06/23 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
前后台交互过程中json格式如何解析以及如何生成
2012/12/26 Javascript
Js控制弹窗实现在任意分辨率下居中显示
2013/08/01 Javascript
使用jQuery简单实现模拟浏览器搜索功能
2014/12/21 Javascript
原生javascript获取元素样式
2014/12/31 Javascript
Javascript通过overflow控制列表闭合与展开的方法
2015/05/15 Javascript
javascript事件模型介绍
2016/05/31 Javascript
JavaScript获取select中text值的方法
2017/02/13 Javascript
js实现兼容PC端和移动端滑块拖动选择数字效果
2017/02/16 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
2017/02/19 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
javascript实现文本框标签验证的实例代码
2018/10/14 Javascript
详解IOS微信上Vue单页面应用JSSDK签名失败解决方案
2018/11/14 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
2019/04/17 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
python中快速进行多个字符替换的方法小结
2016/12/15 Python
python实现守护进程、守护线程、守护非守护并行
2018/05/05 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
python将一组数分成每3个一组的实例
2018/11/14 Python
python安装scipy的方法步骤
2019/06/26 Python
python使用sklearn实现决策树的方法示例
2019/09/12 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
2020/06/22 Python
详解Pandas 处理缺失值指令大全
2020/07/30 Python
Python连接Impala实现步骤解析
2020/08/04 Python
实现CSS3中的border-radius(边框圆角)示例代码
2013/07/19 HTML / CSS
加工操作管理制度
2014/01/19 职场文书
日化店促销方案
2014/03/26 职场文书
《雪儿》教学反思
2014/04/17 职场文书
伦敦奥运会的口号
2014/06/21 职场文书
如何写新闻稿
2015/07/18 职场文书
优秀教师工作总结2015
2015/07/22 职场文书