关于JS递归中的坑

作者: 孤香远 | 来源:发表于2018-09-12 20:39 被阅读16次

    昨天在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递归中的坑

        本文链接:https://www.haomeiwen.com/subject/mrubgftx.html