程序员技术干货程序员Web前端之路

关于JS递归中的坑

2018-09-12  本文已影响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都是把最新的函数调用返回到外层的函数调用,所以通过调用函数就能拿到值了。

上一篇下一篇

猜你喜欢

热点阅读