【发布时间】: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