关于为什么要return Arr[0]的问题
来源:3-3 电话号码组合-代码演示

橙序猿哥哥
2019-05-30
var letterCombinations = function(digits) {
let numCode = ['','','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz'];
let num = digits.split("");//用字符串将输入字符分割为一个一个的数字,num是字符串的分隔数组
//1、映射函数 arr存着将每个数字映射成字符串的数组
let arr = num.map( (item) => numCode[ parseInt(item) ] );//map映射返回一个新数组
//2、定义组合函数,每次只组合arr的前两位,并用递归实现
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]}` );
}
}
//temp已组合完arr的前两项,将arr前两项替换为temp
Arr.splice(0 , 2 , temp );//这里temp是个数组,初次迭代时利用了字符串是类数组结构,也可以用string[num]来获取其中的单个字符
//判断Arr还剩几项,如果剩一项,就返回这个temp,因为Arr会包裹temp,直接返回Arr其里面的内容是个数组
if(Arr.length > 1){
//需要递归
comb( Arr );//递归条件
}else{
return temp;//基线条件
}
return Arr[0] ;//
/*
为什么要返回Arr[0]
*/
}
return comb(arr) ;
};
console.log( letterCombinations("234") );
1回答
-
橙序猿哥哥
提问者
2019-05-30
想了一个上午,现在感觉自己稍微想通一点,想写在这,让大家帮我看看对不对。
首先要说的一点是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),这样看起来岂不是比我上面那种更酷炫吗? 哈哈哈哈哈
这就是我对于这道题的想法,大家看看有什么漏洞多指出来啊,哈哈哈,谢谢!
012019-05-30
相似问题