请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于为什么要return Arr[0]的问题

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") );

正在回答 回答被采纳积分+3

1回答

提问者 橙序猿哥哥 2019-05-30 14:39:17

想了一个上午,现在感觉自己稍微想通一点,想写在这,让大家帮我看看对不对。

首先要说的一点是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),这样看起来岂不是比我上面那种更酷炫吗? 哈哈哈哈哈

这就是我对于这道题的想法,大家看看有什么漏洞多指出来啊,哈哈哈,谢谢!

0 回复 有任何疑惑可以回复我~
  • 很用心的思考,再遇到这样的问题,直接log arr,arr[0]就会理解了
    回复 有任何疑惑可以回复我~ 2019-05-30 23:35:29
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信