想了一个上午,现在感觉自己稍微想通一点,想写在这,让大家帮我看看对不对。
首先要说的一点是function( 形参 ){},如果形参是个引用变量(数组、对象等),那么其实传入函数的是这个引用变量的内存地址,对于本题来说也就是这个数组 arr 的内存地址,首次传入arr后,经过一系列的操作,到了if_else判断那一块,也就是迭代的判断条件,可以看到comb(Arr),再一次将Arr传入到comb中,此时传入的是经过首次comb操作后的arr,这时的arr已经“变样了”,也就是在原来arr的基础上的前两项被“合并”了,变成新的arr了,这种操作的影响“意义很深远”,大家懂我的意思吧,其实就是对arr的操作是操作的内存地址中存储的那个arr变量,经过多次迭代,最终到了 arr 中只剩一项,此时 arr 也不再是最开始传入的arr了,已经成了 [ temp ]。
那么为什么要 return 一个 Arr[0] 呢?这就要提到 js中function的 第二个点,当函数没有返回值时,默认返回undifined。如果在不写一句 return Arr[0],每层迭代的函数就会默认返回一个undefined,当然这也无可厚非,因为我们在函数外面的 arr 没经过一次递归,就被改造一次,这么多次循环下来,arr已经被改造了多次了,已经变成我们想要的那个模样了,比如我这样写也是可以得到正确结果的(直接看comb函数的结尾就行)
var letterCombinations = function(digits) {
let numCode = ['','','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz'];
let num = digits.split("");
let arr = num.map( (item) => numCode[ parseInt(item) ] );//map映射返回一个新数组
function comb( Arr ){
let temp = new Array();
for( let i = 0 ; i < Arr[0].length ; i++ ){
for( let j = 0 ; j < Arr[1].length ; j++ ){
//利用es6强模板字符串拼接
temp.push( `${Arr[0][i]}${Arr[1][j]}` );
}
}
Arr.splice(0 , 2 , temp );string[num]来获取其中的单个字符
if(Arr.length > 1){
//需要递归
comb( Arr );//递归条件
}else{
return temp;//基线条件
}
}
comb(arr);
return arr[0];
};
//测试
console.log( letterCombinations("234") );
即comb函数内部什么也不返回,直接结束默认返回return undefined, 而函数总体返回一个arr[0],也是可以得到正确结果的。所以说这一看,其实没必要纠结到底需要返回什么,因为我们最终“改造”arr的目标已经实现了,既然已经将arr改造成我们想要的样子了,那任务就已经完成了,如果说为什么非要返回一个Arr[0],其实大家仔细品味一下可以发现,老师这么写让代码看起来更有立体感,comb函数 return Arr[0],对于外面调用时可以直接return comb(arr),这样看起来岂不是比我上面那种更酷炫吗? 哈哈哈哈哈
这就是我对于这道题的想法,大家看看有什么漏洞多指出来啊,哈哈哈,谢谢!