我正在为Two-Sum(也许有点过分设计,但主要是让我对递归和闭包感到满意)的解决方案,并且在必要时我试图避免在全局范围内建立计数器。但是,我的函数返回的是未定义的,而且我真的不知道自己在做什么错。
因此,我将我的功能(最初的innerFunction是功能的整体,startingIndex
是全局的)包装在一个内部功能中,将returnArray
设置为在{{1} }完成,然后返回... innerFunction
。我将returnArray
分配给returnArray
的返回值似乎无关紧要,但仍未定义。我必须缺少关于执行上下文的信息,我敢肯定这很明显,但是我正在空白。
innerFunction
例如,我希望function twoSum(numArr, target) {
let startingIndex = 0;
let returnArray = [];
function innerFunction(array, integer) {
let startNum = array.shift();
let subtractedNum = integer - startNum;
let found = array.findIndex(function(element) {
return element === subtractedNum
})
if (found >= 0) {
//found is the index of the shortened array
//add 1 for the initial shift
//add starting index, which doubles to track the amount of shifts thus far
let endingIndex = found + 1 + startingIndex
return [startingIndex, endingIndex];
} else {
startingIndex++;
innerFunction(array, integer);
}
}
returnArray = innerFunction(numArr, target)
return returnArray;
}
console.log(twoSum([4,2,5,7,8,1,9,12,3], 15));
输出twoSum([4,2,5,7,8,1,9,12,3], 15)
,就像包装函数之前一样。我想念什么?
答案 0 :(得分:2)
您的innerFunction
在else
分支中不返回任何内容,但是您将其调用的返回值分配给returnArray
变量。
您还必须返回递归调用的结果:
} else {
startingIndex++;
return innerFunction(array, integer);
}
答案 1 :(得分:2)
您的结果是不确定的,因为此行需要一个return语句:
innerFunction(array, integer);
这是一个可行的解决方案:
function twoSum(position, array, integer) {
let answer = []
let startNum = array[position];
let subtractedNum = integer - startNum;
let index = -1
for (var i = position + 1; i < array.length; i++) {
if( array[i] === subtractedNum ) {
index = i
}
}
if (index >= 0) {
answer = [[position, index]]
}
if (array.length - position > 1) {
let theRest = twoSum(position + 1, array, integer);
answer = [...answer, ...theRest]
}
return answer
}
console.log(twoSum(0, [4,2,5,7,8,1,9,12,3], 15));
即使您添加此return语句,您的解决方案当前也只会返回一个答案,除非您将答案扔到全局累加器(returnArray
)上或在返回递归函数之前合并您的答案(这是什么)我选择在上面做)。