在LeetCode上做了一道算法題
題目是這樣的--
給定一個(gè)整數(shù)數(shù)組和一個(gè)目標(biāo)值,找出數(shù)組中和為目標(biāo)值的兩個(gè)數(shù)。
你可以假設(shè)每個(gè)輸入只對(duì)應(yīng)一種答案,且同樣的元素不能被重復(fù)利用。
示例:
···
給定 nums = [2, 7, 11, 15], target = 9
因?yàn)?nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
···
首先想到了用雙循環(huán)的方法去做
···
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)? ? };
····
然后就出事了,調(diào)用? twoSum([2, 7, 11, 15],26)? 打印出來都是undefined,腫么費(fèi)事?然后就開始DEBUG,一步一步的跟,發(fā)現(xiàn)只要走到 return 后,雖然遞歸是停止了,但是DUBUG指針直接走到函數(shù)尾,并沒有對(duì)值進(jìn)行返回。
然后就蒙蔽了,不是在進(jìn)行判斷的時(shí)候進(jìn)行了返回值的嗎。
又跟了幾遍代碼,最后發(fā)現(xiàn)好像返回的值沒有返回到外層,而是還是留在了遞歸內(nèi)部。
繼續(xù)debug,最后在走到twoSum(nums, target,_index)的時(shí)候,一拍大腿,搞忘了return 函數(shù)
····
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)? ? };
····
這樣就解決了,也順利通過了代碼測試
想了想,最后一次進(jìn)行遞歸操作的時(shí)候值是返回了,但是只是返回到了遞歸自己調(diào)用的函數(shù)里,而最初的函數(shù)是沒有返回值的·,所以打印出來就是undefined,如果想要函數(shù)最后一次計(jì)算所得值,就需要在每次調(diào)用該函數(shù)的時(shí)候進(jìn)行return,每一次return都是把最新的函數(shù)調(diào)用返回到外層的函數(shù)調(diào)用,所以通過調(diào)用函數(shù)就能拿到值了。