Javascript 递归代替循环中遇到的问题。求助!!

qq_40531028 2019-05-14 09:37:03
功能是对数组进行排列组合。 想用递归替代循环 在递归出口出打印数值没有问题 返回之后打印却是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); }
...全文
108 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
河南棒小伙 2019-05-15
  • 打赏
  • 举报
回复
修改两点:在截图里已经标明了。 第一点,注意形参与实参的区别,在doC中虽然将match1传入了,这只相当于给函数doC中的形参match赋值而已,并没有实际对match1进行操作。 第二点,在doC函数内部递归时也有同样的问题,最下面,循环调用doC时又有同样的问题,match重新传入之后,此时计算过的match跟再次调用doC时的形参match就相当于第一次调用doC时的match1与形参match关系是一样的,所以下面得再加一个return 持续调用才能保证是一直连续的。
Unicode Escapes 2019-05-15
  • 打赏
  • 举报
回复
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);
}
瞧俺老孙的 2019-05-14
  • 打赏
  • 举报
回复
建议题主看一下变量作用域的说明,在doC 这个函数里面,match1 作为参数传递进来,虽然他是全局变量,但是在doC函数里面,你操作的仅仅是局部变量 match,没有对全局变量进行操作。

87,993

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧