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 相关文章推荐
学习ExtJS form布局
Oct 08 Javascript
javascript之querySelector和querySelectorAll使用说明
Oct 09 Javascript
jQuery CSS()方法改变现有的CSS样式
Aug 20 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
Apr 06 Javascript
基于JavaScript创建动态Dom
Dec 08 Javascript
jquery简单倒计时实现方法
Dec 18 Javascript
jQuery遮罩层效果实例分析
Jan 14 Javascript
js时间查询插件使用详解
Apr 07 Javascript
js+html5实现页面可刷新的倒计时效果
Jul 15 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
Sep 04 Javascript
利用Vue构造器创建Form组件的通用解决方法
Dec 03 Javascript
JS实现容器模块左右拖动效果
Jan 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截取后台登陆密码的代码
2012/05/05 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
yii,CI,yaf框架+smarty模板使用方法
2015/12/29 PHP
php实现等比例压缩图片
2018/07/26 PHP
php实现有序数组旋转后寻找最小值方法
2018/09/27 PHP
style、 currentStyle、 runtimeStyle区别分析
2010/08/01 Javascript
javascript实用小函数使用介绍
2013/11/11 Javascript
js实现按一下删除键删除整个单词附demo
2014/09/05 Javascript
jQuery中size()方法用法实例
2014/12/27 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
jquery动态增加删减表格行特效
2015/11/20 Javascript
javascript 四十条常用技巧大全
2016/09/09 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
JS中图片压缩的方法小结
2017/11/14 Javascript
nodeJS微信分享
2017/12/20 NodeJs
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
2019/05/10 Javascript
微信小程序通过一个json实现分享朋友圈图片
2019/09/03 Javascript
如何用vue-cli3脚手架搭建一个基于ts的基础脚手架的方法
2019/12/12 Javascript
js实现炫酷光感效果
2020/09/05 Javascript
Python操作csv文件实例详解
2017/07/31 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
2020/03/30 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
Xadmin+rules实现多选行权限方式(级联效果)
2020/04/07 Python
django 连接数据库出现1045错误的解决方式
2020/05/14 Python
最好的商品表达自己:Cafepress
2019/09/04 全球购物
澳大利亚领先的在线药房:Pharmacy Online(有中文站)
2020/02/22 全球购物
生物化学研究助理员求职信
2013/10/09 职场文书
给海归自荐信的建议
2013/12/13 职场文书
入党推优材料
2014/06/02 职场文书
团日活动总结模板
2014/06/25 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
公司合作意向书范文
2014/07/30 职场文书
党的群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书