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的js分页代码
Jun 10 Javascript
jquery中dom操作和事件的实例学习 下拉框应用
Dec 01 Javascript
window.onresize 多次触发的解决方法
Nov 08 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
Jun 12 Javascript
js两种拼接字符串的简单方法(必看)
Sep 02 Javascript
JavaScript数据结构学习之数组、栈与队列
May 02 Javascript
JavaScript中.min.js和.js文件的区别讲解
Feb 13 Javascript
详解async/await 异步应用的常用场景
May 13 Javascript
vue实现手机端省市区区域选择
Sep 27 Javascript
Vue页面手动刷新,实现导航栏激活项还原到初始状态
Aug 06 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
Sep 22 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
Dec 26 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
一个php作的文本留言本的例子(四)
2006/10/09 PHP
PHP版网站缓存加快打开速度的方法分享
2012/06/03 PHP
php中curl、fsocket、file_get_content三个函数的使用比较
2014/05/09 PHP
phplot生成图片类用法详解
2015/01/06 PHP
CodeIgniter表单验证方法实例详解
2016/03/03 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
JavaScript 编程引入命名空间的方法
2007/06/29 Javascript
JavaScript 基础知识 被自己遗忘的
2009/10/15 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
详解Javascript 装载和执行
2014/11/17 Javascript
javascript实现链接单选效果的方法
2015/05/13 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
2015/08/04 Javascript
使用JQuery实现智能表单验证功能
2016/03/08 Javascript
javascript 继承学习心得总结
2016/03/17 Javascript
基于javascript显示当前时间以及倒计时功能
2016/03/18 Javascript
15款最好的Bootstrap在线编辑器
2016/08/03 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
vue 使用eventBus实现同级组件的通讯
2018/03/02 Javascript
微信小程序实现倒计时补零功能
2018/07/09 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
微信小程序实现弹框效果
2020/05/26 Javascript
JavaScript 防盗链的原理以及破解方法
2020/12/29 Javascript
零基础写python爬虫之urllib2使用指南
2014/11/05 Python
python list转矩阵的实例讲解
2018/08/04 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
巴西家用小家电购物网站:Polishop
2016/08/07 全球购物
洛杉矶生活休闲而精致的基础品牌:Mika Jaymes
2018/01/07 全球购物
先进德育工作者事迹材料
2014/01/24 职场文书
小学音乐教学反思
2014/02/05 职场文书
旅游管理毕业生自荐信范文
2014/03/19 职场文书
《大海那边》教学反思
2014/04/09 职场文书
服装仓管员岗位职责
2014/06/17 职场文书
技术股东合作协议书
2014/12/02 职场文书
团日活动总结格式
2015/05/11 职场文书