JavaScript如何实现元素全排列实例代码
排列(Permutation/Arrangement)
概念
n个不同元素中任意选取m(m<=n)个元素进行排列,所有排列情况的个数叫做排列数,其值等于:
A=n!/(n-m)!
!表示数学中的阶乘运算符,可以通过以下函数实现:
functionfactorial(n){ if(n===0||n===1){ return1; }elseif(n<0){ returnnull; }else{ returnn*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 => 63个元素中选取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
实现
letarr=[1,2,3]; /* 参数a为输入数组, 元素个数n为a的长度, 选取个数为m; */ functionpermutation(a,m){ //保存最终输出结果 letresult=[]; //定义m值默认等于n,即全排列 letn=a.length; m=m||n; //定义递归函数保存结果到数组中 //_a为输入数组, //tmpResult为保存单个情况结果的数组 functionrecur(_a,tmpResult=[]){ if(tmpResult.length===m){ //结果达到m个时保存结果, //停止递归并进入下一次遍历 result.push(tmpResult); }else{ for(leti=0;i<_a.length;i++){ //复制一份输入数组,防止引用值被改变 lettmpA=_a.concat(); //复制一份保存结果的数组,防止每次遍历相互影响 let_tmpResult=tmpResult.concat(); //保存当前遍历值 _tmpResult.push(tmpA[i]); //删除当前遍历值,传递参数进入下一层递归 tmpA.splice(i,1); recur(tmpA,_tmpResult); } } } //开始执行递归,然后返回最后结果 recur(a); returnresult; } 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不能大于元素个数;
拓展
以上函数输出值为一个二维数组,如果需要便于观察,输出一个一维数组,可以定义一个合并函数:
functionmerge(arr){ returnarr.map(x=>x.join('')); } letresult=merge(permutation([1,2,3])); console.log(result); //[123,132,213,231,312,321]
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。