在 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 都是把最新的函数调用返回到外层的函数调用, 所以通过调用函数就能拿到值了.
来源: http://www.jianshu.com/p/ca514efd3830