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 相关文章推荐
jquery下onpropertychange事件的绑定方法
Aug 01 Javascript
JS中表单的使用小结
Jan 11 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
Feb 28 Javascript
原生js结合html5制作简易的双色子游戏
Mar 30 Javascript
javascript DIV实现跟随鼠标移动
Mar 19 Javascript
简单理解JavaScript中的封装与继承特性
Mar 19 Javascript
vue解决跨域路由冲突问题思路解析
Nov 03 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
Nov 22 Javascript
select2 ajax 设置默认值,初始值的方法
Aug 09 Javascript
获取layer.open弹出层的返回值方法
Aug 20 Javascript
Vue实现数据请求拦截
Oct 23 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
Jul 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
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
JavaScript表单常用验证集合
2008/01/16 Javascript
javascript 一个函数对同一元素的多个事件响应
2009/07/25 Javascript
jquery实现网页查找功能示例分享
2014/02/12 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
JavaScript中的冒泡排序法
2016/08/03 Javascript
JS正则表达式修饰符global(/g)用法分析
2016/12/27 Javascript
jQuery实现动态给table赋值的方法示例
2017/07/04 jQuery
Vue Spa切换页面时更改标题的实例代码
2017/07/15 Javascript
温故知新——JavaScript中的字符串连接问题最全总结(推荐)
2017/08/21 Javascript
js实现本地时间同步功能
2017/08/26 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
整理HTML5中支持的URL编码与字符编码
2016/02/23 HTML / CSS
美国成衣女装品牌:CHICO’S
2016/09/19 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
武汉某公司的C#笔试题面试题
2015/12/25 面试题
会议邀请函范文
2014/01/09 职场文书
初中考试作弊检讨书
2014/02/01 职场文书
社会学专业学生职业规划书
2014/02/07 职场文书
上班打牌检讨书
2014/02/07 职场文书
《长相思》听课反思
2014/04/10 职场文书
个人合作协议书范本
2014/04/18 职场文书
高中生第一学年自我鉴定
2014/09/12 职场文书
2014年维修工作总结
2014/11/22 职场文书
环保守法证明
2015/06/24 职场文书
《半截蜡烛》教学反思
2016/02/19 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书
解决Redis启动警告问题
2022/02/24 Redis
Python matplotlib可视化之绘制韦恩图
2022/02/24 Python
Python之matplotlib绘制饼图
2022/04/13 Python