关于JS递归中的坑

在LeetCode上做了一道算法题


题目是这样的--

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

···

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

···

首先想到了用双循环的方法去做

···

let twoSum = function(nums, target) {

    for (let i = 0,len=nums.length; i < len; i++) {

        for (let j = 0; j < len; j++) {

            if(nums[i] + nums[j] === target){

                return [i,j]

                    }}}};

···

简单暴力瞬间通过测试

但是这样做看着就low,随后打算用递归试试

····

let twoSum = function(nums, target, _index=0) {

    const num = nums[_index]

    for(let i=_index+1,len=nums.length;i++){

        if((num + nums[i])===target){

            return [_index, i]

}}

    _index++

    twoSum(nums, target,_index)    };

····

然后就出事了,调用  twoSum([2, 7, 11, 15],26)  打印出来都是undefined,肿么费事?然后就开始DEBUG,一步一步的跟,发现只要走到 return 后,虽然递归是停止了,但是DUBUG指针直接走到函数尾,并没有对值进行返回。

然后就蒙蔽了,不是在进行判断的时候进行了返回值的吗。

又跟了几遍代码,最后发现好像返回的值没有返回到外层,而是还是留在了递归内部。

继续debug,最后在走到twoSum(nums, target,_index)的时候,一拍大腿,搞忘了return 函数

····

let twoSum = function(nums, target, _index=0) {

    const num = nums[_index]

    for(let i=_index+1,len=nums.length;i++){

        if((num + nums[i])===target){

            return [_index, i]

}}

    _index++

    return  twoSum(nums, target,_index)    };

····

这样就解决了,也顺利通过了代码测试

想了想,最后一次进行递归操作的时候值是返回了,但是只是返回到了递归自己调用的函数里,而最初的函数是没有返回值的·,所以打印出来就是undefined,如果想要函数最后一次计算所得值,就需要在每次调用该函数的时候进行return,每一次return都是把最新的函数调用返回到外层的函数调用,所以通过调用函数就能拿到值了。

你可能感兴趣的:(关于JS递归中的坑)