功能是对数组进行排列组合。
想用递归替代循环
在递归出口出打印数值没有问题
返回之后打印却是undefined,这是为什么呢?
求助!
var testarrrrrr=[ ["A","B","C"],["A","B","C"],["A","B","C"]];
var match1;
testarrrrrr=doCombination(testarrrrrr);
console.log(testarrrrrr);
function PPP(arr1,arr2)
{
    var arrp=[];
    var combine;
 for(var i = 0;i<arr1.length;i++)
 {
    for(var j=0;j<arr2.length;j++)
    {
        combine=arr1[i]+arr2[j];
        arrp.push(combine);
    }
 }
 return arrp;
}function doCombination(arr)
{
doC(0,arr,match1);
console.log(match1);
/*    for(var i=0;i<arr.length-1;i++)
    {
        if(i==0) {
            match1 = PPP(arr[0], arr[1]);
        }
        else
        {
            match1=PPP(match1,arr[i+1]);
        }
    }*/
    return match1;
}
function doC(x,arr3,match) {
    if (x ==arr3.length-1)
    {
        console.log(match);
        return match;
    }
    if(x==0) {
        match = PPP(arr3[0], arr3[1]);
    }
    else
    {
        match=PPP(match,arr3[x+1]);
    }
doC(x+1,arr3,match);
}

解决方案 »

  1.   

    建议题主看一下变量作用域的说明,在doC 这个函数里面,match1 作为参数传递进来,虽然他是全局变量,但是在doC函数里面,你操作的仅仅是局部变量 match,没有对全局变量进行操作。
      

  2.   

    function doC(x,arr3,match) {//此时,形参match存的地址与match1相同,即它们两个指向相同的区域
        if (x ==arr3.length-1)
        {
            console.log(match);
            return match;
        }
        if(x==0) {
            match = PPP(arr3[0], arr3[1]);//你的调用首先执行的会是这行代码,而这行代码给match赋值了一个新的地址,及match和match已经不是指向同一个对象了,对match的修改并不影响match1的值。因此无论之后进行什么操作,都影响不到match1的值——因此match1会保持原值undefined
        }
        else
        {
            match=PPP(match,arr3[x+1]);
        }
    doC(x+1,arr3,match);
    }
      

  3.   


    修改两点:在截图里已经标明了。
    第一点,注意形参与实参的区别,在doC中虽然将match1传入了,这只相当于给函数doC中的形参match赋值而已,并没有实际对match1进行操作。
    第二点,在doC函数内部递归时也有同样的问题,最下面,循环调用doC时又有同样的问题,match重新传入之后,此时计算过的match跟再次调用doC时的形参match就相当于第一次调用doC时的match1与形参match关系是一样的,所以下面得再加一个return 持续调用才能保证是一直连续的。