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 相关文章推荐
dojo学习第一天 Tab选项卡 实现
Aug 28 Javascript
用Mootools获得操作索引的两种方法分享
Dec 12 Javascript
11个用于提高排版水平的基于jquery的文字效果插件
Sep 14 Javascript
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
Dec 13 Javascript
jquery js 重置表单 reset()具体实现代码
Aug 05 Javascript
浅析用prototype定义自己的方法
Nov 14 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
Feb 12 Javascript
javascript解三阶幻方(九宫格)
Apr 22 Javascript
全面解析Bootstrap手风琴效果
Apr 17 Javascript
基于javascript实现tab选项卡切换特效调试笔记
Mar 30 Javascript
jQuery上传多张图片带进度条样式(DEMO)
Mar 02 Javascript
在Vue.js中使用TypeScript的方法
Mar 19 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
服务端 VBScript 与 JScript 几个相同特性的写法 By shawl.qiu
2007/03/06 Javascript
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
javascript 拖放效果实现代码
2010/01/22 Javascript
用JQuery模仿淘宝的图片放大镜显示效果
2011/09/15 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
node.js中的fs.existsSync方法使用说明
2014/12/17 Javascript
详解webpack3如何正确引用并使用jQuery库
2017/08/26 jQuery
React props和state属性的具体使用方法
2018/04/12 Javascript
vue.js做一个简单的编辑菜谱功能
2018/05/08 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
详解小程序原生使用ES7 async/await语法
2018/08/06 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
2019/09/19 Javascript
Vue 解决多级动态面包屑导航的问题
2019/11/04 Javascript
JS绘图Flot如何实现可选显示曲线图功能
2020/10/16 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
[58:37]Serenity vs Fnatic 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Pyramid Mako模板引入helper对象的步骤方法
2013/11/27 Python
python利用不到一百行代码实现一个小siri
2017/03/02 Python
python数字图像处理之骨架提取与分水岭算法
2018/04/27 Python
python如何生成各种随机分布图
2018/08/27 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
2019/04/12 Python
Python爬虫动态ip代理防止被封的方法
2019/07/07 Python
Python日志无延迟实时写入的示例
2019/07/11 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
2019/08/12 Python
python实现单链表的方法示例
2019/09/03 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
如何导出python安装的所有模块名称和版本号到文件中
2020/06/05 Python
keras CNN卷积核可视化,热度图教程
2020/06/22 Python
环保倡议书300字
2014/05/15 职场文书
酒店前台辞职书
2015/02/26 职场文书
员工自我评价范文
2015/03/11 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
2016师德师风学习心得体会
2016/01/12 职场文书
Python中Permission denied的解决方案
2021/04/02 Python
redis实现排行榜功能
2021/05/24 Redis
详解Redis瘦身指南
2021/05/26 Redis