JavaScript 计算笛卡尔积实例详解
JavaScript实现笛卡尔积
注意:本文中所说的集合是指数学上的集合,不是es6里的Set。
整体思路如下:
- 用户传入一个二维的数组,每个子数组都是一个要进行笛卡尔积计算的集合。返回一个二维数组,每个子数组都是一个有序对或者n元有序组。
- 当用户传入一个集合的时候,为了兼容业务,返回形如:[[a],[b]…]的二维数组。
- 当用户只传入两个集合计算的时候,普通的嵌套计算即可。
- 当用户传入3个或者3个以上的集合的时候,先计算最后两个集合的结果,再依次把前面的集合与其进行计算。
实现代码如下:
descates.js
/**
*CreatedbyHawkon2016/6/18.
*/
varDescartesUtils={
/**
*如果传入的参数只有一个数组,求笛卡尔积结果
*@paramarr1一维数组
*@returns{Array}
*/
descartes1:function(arr1){
//返回结果,是一个二维数组
varresult=[];
vari=0;
for(i=0;i<arr1.length;i++){
varitem1=arr1[i];
result.push([item1]);
}
returnresult;
},
/**
*如果传入的参数只有两个数组,求笛卡尔积结果
*@paramarr1一维数组
*@paramarr2一维数组
*@returns{Array}
*/
descartes2:function(arr1,arr2){
//返回结果,是一个二维数组
varresult=[];
vari=0,j=0;
for(i=0;i<arr1.length;i++){
varitem1=arr1[i];
for(j=0;j<arr2.length;j++){
varitem2=arr2[j];
result.push([item1,item2]);
}
}
returnresult;
},
/**
*
*@paramarr2D二维数组
*@paramarr1D一维数组
*@returns{Array}
*/
descartes2DAnd1D:function(arr2D,arr1D){
vari=0,j=0;
//返回结果,是一个二维数组
varresult=[];
for(i=0;i<arr2D.length;i++){
vararrOf2D=arr2D[i];
for(j=0;j<arr1D.length;j++){
varitem1D=arr1D[j];
result.push(arrOf2D.concat(item1D));
}
}
returnresult;
},
descartes3:function(list){
varlistLength=list.length;
vari=0,j=0;
//返回结果,是一个二维数组
varresult=[];
//为了便于观察,采用这种顺序
vararr2D=DescartesUtils.descartes2(list[0],list[1]);
for(i=2;i<listLength;i++){
vararrOfList=list[i];
arr2D=DescartesUtils.descartes2DAnd1D(arr2D,arrOfList);
}
returnarr2D;
},
//笛卡儿积组合
descartes:function(list)
{
if(!list){
return[];
}
if(list.length<=0){
return[];
}
if(list.length==1){
returnDescartesUtils.descartes1(list[0]);
}
if(list.length==2){
returnDescartesUtils.descartes2(list[0],list[1]);
}
if(list.length>=3){
returnDescartesUtils.descartes3(list);
}
}
};
descartes.html
<!DOCTYPEhtml>
<html>
<head>
<metacharset="UTF-8">
<title></title>
<scripttype="text/javascript"src="descartes.js"></script>
</head>
<body>
<divid="resultDiv"></div>
<scripttype="text/javascript">
vararr1=[1,2,3];
vararr2=["a","b","c","d"];
varlist=[arr1,arr2];
varlist2=[
[1,2,3],
["a","b","c"],
["A","B"],
["啊","把","车","的"]
];
varresult=DescartesUtils.descartes(list2);
varhtml="";
for(vari=0;i<result.length;i++){
html=html+result[i].join(",")+"<br>";
}
document.getElementById("resultDiv").innerHTML=html;
</script>
</body>
</html>
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!