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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。