【问题标题】:LeetCode - Why does this function return undefined, although it has just logged an array?LeetCode - 为什么这个函数返回未定义,尽管它刚刚记录了一个数组?
【发布时间】:2019-10-31 06:18:54
【问题描述】:

由于我是编程新手,我目前正在尝试通过解决 LeetCode 上的一些简单问题来应用我学到的基础知识。然而,“3Sum”问题让我想到了一些我似乎不明白的事情。 以下是练习的定义:

给定一个由 n 个整数组成的数组 nums,在 nums 中是否存在元素 a、b、c 使得 a + b + c = 0?查找数组中所有唯一的三元组,其总和为零。

现在,这是我想出的:

var result = [];
var threeSum = function(nums) {
    for (let i = 1; i < nums.length; i++) {
        for (let j = i + 1; j < nums.length; j++) {
            if (nums[0] + nums[i] + nums[j] == 0) {
                result.push([nums[0], nums[i], nums[j]])
            }
        }
    }

    if(nums.length > 3) {
        nums.shift();
        threeSum(nums);
    } else {
        console.log("result: ", result);
        return result;
    } 
};

现在我正在使用以下输入进行测试:

[-1,0,1,2,-1,-4]

底部else块中的console.log语句给出:

结果:[ [ -1, 0, 1 ], [ -1, 2, -1 ], [ 0, 1, -1 ] ]

这正是我现在希望它退出的内容。

但是下面的 return 语句返回“未定义”。

由于它们都在同一个 else 块中,我认为它们都应该被执行。 如何将“结果”记录为数组,但是返回它会导致它“未定义”?

请注意,我知道这可能不是解决此问题的正确方法,也不是该练习的足够解决方案。我不要求任何更正,因为我想自己开发算法,只是在这种情况下,“结果”似乎同时被定义和未定义:)

【问题讨论】:

  • 您在递归调用中缺少return
  • 顺便说一句,递归函数通常应该使用在 function 关键字之后给定的名称来调用自身,而不是恰好分配给 var 中的封闭范围。如果有东西覆盖了后者,你的递归就会中断,但是命名函数的名称在该函数的范围内总是有效的。
  • @Alnitak 哦,我明白了。我通常不会像上面的例子那样编写函数,当我开始练习时,LeetCode 已经预先编写了函数。但无论如何,很高兴知道谢谢!

标签: javascript arrays return undefined


【解决方案1】:

你快到了。只需添加 return 即可进行递归:

var result = [];
var threeSum = function(nums) {
    for (let i = 1; i < nums.length; i++) {
        for (let j = i + 1; j < nums.length; j++) {
            if (nums[0] + nums[i] + nums[j] == 0) {
                result.push([nums[0], nums[i], nums[j]])
            }
        }
    }

    if(nums.length > 3) {
        nums.shift();
        return threeSum(nums);  // <-- return here
    } else {
        return result;
    } 
};

console.log(threeSum([-1,0,1,2,-1,-4]))

【讨论】:

  • 非常感谢,这已经解决了我的问题!其实看到这里,说的很有道理,不过我不完全明白,为什么没有return就不行了……
猜你喜欢
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多