摘要:遞歸原理之先看以下代碼打開瀏覽器斷點調試,觀看執行過程代碼執行過程此時函數開始向上回溯將代碼修改一下每次將返回代碼執行過程此時函數開始向上回溯總結所以在遞歸過程中,如果遞歸依賴上一次遞歸的結果,需要將結果。
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瀏覽器斷點調試,觀看js執行過程
//代碼執行過程 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 //此時函數開始向上回溯 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))
//代碼執行過程 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 //此時函數開始向上回溯 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
總結:
所以在遞歸過程中,如果遞歸依賴上一次遞歸的結果,需要將結果return。
如果不需要上一次的結果,就不需要return。
所以示例代碼的正確寫法是:
function multiply(n) { if (n <= 1) { return 1; } return n * multiply(n - 1); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107065.html
摘要:今天這篇文章我們來看看一道必會面試題,即如何實現一個深拷貝。木易楊注意這里使用上面測試用例測試一下一個簡單的深拷貝就完成了,但是這個實現還存在很多問題。 引言 上篇文章詳細介紹了淺拷貝 Object.assign,并對其進行了模擬實現,在實現的過程中,介紹了很多基礎知識。今天這篇文章我們來看看一道必會面試題,即如何實現一個深拷貝。本文會詳細介紹對象、數組、循環引用、引用丟失、Symbo...
摘要:算法之深度優先遍歷和廣度優先遍歷背景在開發頁面的時候,我們有時候會遇到這種需求在頁面某個節點中遍歷,找到目標節點,我們正常做法是利用選擇器,或者,但在本文,我們從算法的角度去查找節點,同時理解一下深度優先遍歷和廣度優先遍歷的原理。 JS算法之深度優先遍歷(DFS)和廣度優先遍歷(BFS) 背景 在開發頁面的時候,我們有時候會遇到這種需求:在頁面某個dom節點中遍歷,找到目標dom節點,...
摘要:前言在計算機領域,記憶是主要用于加速程序計算的一種優化技術,它使得函數避免重復演算之前已被處理過的輸入,而返回已緩存的結果。被執行了不是素數,其他數字默認是素數。我們可以看出,如果從開始打印斐波那契數列,函數被執行了次。 前言 在計算機領域,記憶(memoization)是主要用于加速程序計算的一種優化技術,它使得函數避免重復演算之前已被處理過的輸入,而返回已緩存的結果。 -- wi...
摘要:實現代碼判斷參數是否是一個數組遞歸出口數組長度為,直接返回數組數組元素有多個,則定義兩個數組循環遍歷數組,把第一個元素當做比較的對象判斷當前元素的大小遞歸調用將所有的結果合并 原理:找到當前數組中的任意一個元素(一般選擇第一個元素),作為標準,新建兩個空數組left、rignt,遍歷整個數組元素,如果遍歷到的元素比當前的元素小就放到數組left,比當前的元素大放到rignt,然后再對新...
閱讀 1625·2021-11-02 14:42
閱讀 521·2021-10-18 13:24
閱讀 939·2021-10-12 10:12
閱讀 1817·2021-09-02 15:41
閱讀 3201·2019-08-30 15:56
閱讀 2874·2019-08-29 16:09
閱讀 2056·2019-08-29 11:13
閱讀 3617·2019-08-28 18:06