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>
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!