例如形如 var versions=[
["1","2"],
["3","4","5"],
["6","7","8"] ,
["9"]
。。。
] 的二维数组,长度不定,每维元素个数不定。要找出例如 1369,1379,1478,1489等,即类似数组中每行依次任取一个元素后的所有组合来,可用如下方法。先取数组第一行的第一个元素1,2,分别当 成树的的根结点,然后把第二行的各元素3,4,5分别作为以1和2为顶点的树子节点,然后用第三行的各元素6,7,8分别作为3,4,5的子节点。依次, 知道,数组结束。结果如下图所示。最后,数组第一行有几个元素就有几颗数。
易知,从根节点到叶节点各条路径上的数字连接起来的串即为我们需要的所有组合。
。。。 。。。
至于代码实现,可以如下这样做,只是需要的空间比较大。方法是:开始时,把所有树位于同一层次的元素,这里是1,2,用一个数组arr0i(0,是第一 层,i代表第几棵树)保存起来,然后处理第二层的元素3,4,5时,首先建立空的数组arr1i,再去遍历第一层形成的数组arr0i各元素,把其中的每 个元素都与3,4,5连接后的结果存入新数组arr1i中。依此直到叶子节点层。比如:最后的数arrn0组中的元素即为第1 棵树产生的字符组合,也就是以1开头的那些字符组合。我是用javascript的数组实现的。下面贴出代码:
<script language="javascript">
var arrLen; //versions数组长度
var comCollction=new Array(); //versions数组产生的所有组合值
//按照下面数组样式,任意添加行,列数(每个元素值都不同,每行元素个数不要求相同) var versions=[
["1","2"],
["3","4","5"],
["6","7"],
["8"]
];
arrLen=versions.length;
function printCombination(){
var k;
var cur_count=0;
var len0=versions[0].length;
//初始化第一个数组,即用versions第一行值生成数组arr0i
for(var i=0;i<len0;i++){
eval("var arr"+0+i+"= new Array()");
eval("arr"+0+i)[0]=versions[0][i];
}
//循环versions的剩余行 (1至arrLen)
for(var m=1;m<arrLen;m++){
//循环arr0i
for(var n=0;n<len0;n++){
k=0;
cur_count=0;
eval("var arr"+m+n+"= new Array()");
while(true){
eval("var temp=arr"+(m-1)+n+"[k]");
//数组arr(m-1)n[k]的值未定义时,跳出
if(eval("temp==undefined")){
break;
}
//versions数组的第m行的每个值与arr(m-1)n[k]连接,保存到新数组arrmn[cur_count]
for(var j=0;j<versions[m].length;j++){
eval("arr"+m+n)[cur_count++]=eval("arr"+(m-1)+n)[k]+versions[m][j];//此处可添加分隔符
}
k++;
}
}
if(m==arrLen-1){ //最后一轮循环结束时,将产生的所有组合赋值给全局数组comCollction
var cnt=0;
for(var w=0;w<len0;w++){
for(var t=0;t<eval("arr"+m+w).length;t++){
//alert(eval("arr"+m+w)[t]);
comCollction[cnt++]=eval("arr"+m+w)[t];
}
}
}
}
}