关于JS递归中的坑
昨天在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都是把最新的函数调用返回到外层的函数调用,所以通过调用函数就能拿到值了。