摘要:遞歸原理之先看以下代碼打開瀏覽器斷點(diǎn)調(diào)試,觀看執(zhí)行過程代碼執(zhí)行過程此時(shí)函數(shù)開始向上回溯將代碼修改一下每次將返回代碼執(zhí)行過程此時(shí)函數(shù)開始向上回溯總結(jié)所以在遞歸過程中,如果遞歸依賴上一次遞歸的結(jié)果,需要將結(jié)果。
js遞歸原理之return
先看以下代碼:
var a = 1; function multiply(n) { if (n <= 1) { return 1; } a = n * multiply(n - 1); console.log("n:" + n); console.log("a:" + a); } console.log(multiply(5))
打開chrome瀏覽器斷點(diǎn)調(diào)試,觀看js執(zhí)行過程
//代碼執(zhí)行過程 a=n*multiply(n-1)//n=5 a=1 a=n*multiply(n-1)//n=4 a=1 a=n*multiply(n-1)//n=3 a=1 a=n*multiply(n-1)//n=2 a=1 a=n*multiply(n-1)//n=1 a=1 return 1 //此時(shí)函數(shù)開始向上回溯 a=n*multiply(n-1)//n=2 a=2*1=2 console.log("n:"+n)//n:2 console.log("a:"+a)//a:2 return undefined a=n*multiply(n-1)//n=3 a=3*undefined=NaN console.log("n:"+n)//n:3 console.log("a:"+a)//a:NaN return undefined a=n*multiply(n-1)//n=4 a=4*undefined=NaN console.log("n:"+n)//n:4 console.log("a:"+a)//a:NaN return undefined a=n*multiply(n-1)//n=5 a=5*undefined=NaN console.log("n:"+n)//n:5 console.log("a:"+a)//a:NaN return undefined
將代碼修改一下:
var a = 1; function multiply(n) { if (n <= 1) { return 1; } a = n * multiply(n - 1); console.log("n:" + n); console.log("a:" + a); return a;//每次將a返回 } console.log(multiply(5))
//代碼執(zhí)行過程 a=n*multiply(n-1)//n=5 a=1 a=n*multiply(n-1)//n=4 a=1 a=n*multiply(n-1)//n=3 a=1 a=n*multiply(n-1)//n=2 a=1 a=n*multiply(n-1)//n=1 a=1 return 1 //此時(shí)函數(shù)開始向上回溯 a=n*multiply(n-1)//n=2 a=2*1=2 console.log("n:"+n)//n:2 console.log("a:"+a)//a:2 return 2 a=n*multiply(n-1)//n=3 a=3*2=6 console.log("n:"+n)//n:3 console.log("a:"+a)//a:6 return 6 a=n*multiply(n-1)//n=4 a=4*6=24 console.log("n:"+n)//n:4 console.log("a:"+a)//a:24 return 24 a=n*multiply(n-1)//n=5 a=5*24=120 console.log("n:"+n)//n:5 console.log("a:"+a)//a:120 return 120
總結(jié):
所以在遞歸過程中,如果遞歸依賴上一次遞歸的結(jié)果,需要將結(jié)果return。
如果不需要上一次的結(jié)果,就不需要return。
所以示例代碼的正確寫法是:
function multiply(n) { if (n <= 1) { return 1; } return n * multiply(n - 1); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/107065.html
摘要:今天這篇文章我們來看看一道必會(huì)面試題,即如何實(shí)現(xiàn)一個(gè)深拷貝。木易楊注意這里使用上面測(cè)試用例測(cè)試一下一個(gè)簡(jiǎn)單的深拷貝就完成了,但是這個(gè)實(shí)現(xiàn)還存在很多問題。 引言 上篇文章詳細(xì)介紹了淺拷貝 Object.assign,并對(duì)其進(jìn)行了模擬實(shí)現(xiàn),在實(shí)現(xiàn)的過程中,介紹了很多基礎(chǔ)知識(shí)。今天這篇文章我們來看看一道必會(huì)面試題,即如何實(shí)現(xiàn)一個(gè)深拷貝。本文會(huì)詳細(xì)介紹對(duì)象、數(shù)組、循環(huán)引用、引用丟失、Symbo...
摘要:算法之深度優(yōu)先遍歷和廣度優(yōu)先遍歷背景在開發(fā)頁(yè)面的時(shí)候,我們有時(shí)候會(huì)遇到這種需求在頁(yè)面某個(gè)節(jié)點(diǎn)中遍歷,找到目標(biāo)節(jié)點(diǎn),我們正常做法是利用選擇器,或者,但在本文,我們從算法的角度去查找節(jié)點(diǎn),同時(shí)理解一下深度優(yōu)先遍歷和廣度優(yōu)先遍歷的原理。 JS算法之深度優(yōu)先遍歷(DFS)和廣度優(yōu)先遍歷(BFS) 背景 在開發(fā)頁(yè)面的時(shí)候,我們有時(shí)候會(huì)遇到這種需求:在頁(yè)面某個(gè)dom節(jié)點(diǎn)中遍歷,找到目標(biāo)dom節(jié)點(diǎn),...
摘要:前言在計(jì)算機(jī)領(lǐng)域,記憶是主要用于加速程序計(jì)算的一種優(yōu)化技術(shù),它使得函數(shù)避免重復(fù)演算之前已被處理過的輸入,而返回已緩存的結(jié)果。被執(zhí)行了不是素?cái)?shù),其他數(shù)字默認(rèn)是素?cái)?shù)。我們可以看出,如果從開始打印斐波那契數(shù)列,函數(shù)被執(zhí)行了次。 前言 在計(jì)算機(jī)領(lǐng)域,記憶(memoization)是主要用于加速程序計(jì)算的一種優(yōu)化技術(shù),它使得函數(shù)避免重復(fù)演算之前已被處理過的輸入,而返回已緩存的結(jié)果。 -- wi...
摘要:實(shí)現(xiàn)代碼判斷參數(shù)是否是一個(gè)數(shù)組遞歸出口數(shù)組長(zhǎng)度為,直接返回?cái)?shù)組數(shù)組元素有多個(gè),則定義兩個(gè)數(shù)組循環(huán)遍歷數(shù)組,把第一個(gè)元素當(dāng)做比較的對(duì)象判斷當(dāng)前元素的大小遞歸調(diào)用將所有的結(jié)果合并 原理:找到當(dāng)前數(shù)組中的任意一個(gè)元素(一般選擇第一個(gè)元素),作為標(biāo)準(zhǔn),新建兩個(gè)空數(shù)組left、rignt,遍歷整個(gè)數(shù)組元素,如果遍歷到的元素比當(dāng)前的元素小就放到數(shù)組left,比當(dāng)前的元素大放到rignt,然后再對(duì)新...
摘要:前言一篇徹底搞懂對(duì)象從此不用擔(dān)心沒對(duì)象啦本文從對(duì)象定義方法對(duì)象屬性數(shù)據(jù)類型遍歷幾種方法對(duì)象拷貝和攔截對(duì)象屬性方法及代碼實(shí)現(xiàn)幾個(gè)方面由淺入深介紹對(duì)象對(duì)象的聲明方法字面量構(gòu)造函數(shù)的作用創(chuàng)了一個(gè)新對(duì)象指向構(gòu)造函數(shù)構(gòu)造函數(shù)有返回會(huì)替換出來的對(duì)象如果 showImg(https://segmentfault.com/img/bVboXHr?w=550&h=392); 前言 一篇徹底搞懂對(duì)象,從此...
閱讀 1639·2021-11-02 14:42
閱讀 535·2021-10-18 13:24
閱讀 974·2021-10-12 10:12
閱讀 1831·2021-09-02 15:41
閱讀 3216·2019-08-30 15:56
閱讀 2886·2019-08-29 16:09
閱讀 2067·2019-08-29 11:13
閱讀 3632·2019-08-28 18:06