本篇文章帶給大家的內容是關於遞迴是什麼? javascript中遞歸的詳解,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
1. 遞迴是啥?
遞迴概念很簡單,「自己呼叫自己」(以下以函數為例)。
在分析遞迴之前,需要先了解下 JavaScript 中「壓棧」(call stack) 概念。
2. 壓棧與出棧
堆疊是什麼?可以理解是在記憶體中某一塊區域,這個區域比喻成一個箱子,你往箱子裡放些東西,這動作就是壓棧。所以最先放下去的東西在箱子最底下,最後放下去的在箱子最上面。把東西從箱子中拿出來可以理解為*出棧。
所以得出結論,我們有個習慣,拿東西是從上面往下拿,最先放下去的東西在箱子的最底下,最後才能拿到。
在 JavaScript 中,呼叫函數時,都會發生壓棧行為,遇到含 return 關鍵字的句子或執行結束後,才會發生出棧(pop)。
來看個例子,這個段程式碼執行順序是怎麼樣的?
function fn1() { return 'this is fn1' } function fn2() { fn3() return 'this is fn2' } function fn3() { let arr = ['apple', 'banana', 'orange'] return arr.length } function fn() { fn1() fn2() console.log('All fn are done') } fn()
上面發生了一系列壓棧出棧的行為:
1、首先,一開始堆疊(箱子)是空的
2、函數fn 執行, fn 先壓棧,放在堆疊(箱子)最底下
3、在函數fn 內部,先執行函數fn1,fn1 壓棧在fn 上面
4、函數fn1 執行,遇到return 關鍵字,返回this is fn1,fn1 出棧,箱子裡現在只剩下fn
5、回到fn 內部,fn1 執行完後,函數fn2 開始執行,fn2 壓棧,但是在fn2 內部,遇到fn3,開始執行fn3,所以fn3 壓棧
6、此時棧中從下往上順序為:fn3
7、以此類推,函數fn3 內部遇到return 關鍵字的句子,fn3 執行完結束後出棧,回到函數fn2 中,fn2 也是遇到return 關鍵字,繼續出棧。
8、現在堆疊中只有 fn 了,回到函數 fn 中,執行 console.log('All fn are done') 語句後,fn 出棧。
9、現在堆疊中又為空了。
上面步驟容易把人繞暈,下面是流程圖:
#再看下在chrome 瀏覽器環境下執行:
##3. 遞迴
先看簡單的JavaScript 遞歸
function sumRange(num) { if (num === 1) return 1; return num + sumRange(num - 1) } sumRange(3) // 6
上面程式碼執行順序:
1、函數sumRange(3) 執行,sumRange(3) 壓棧,遇到return 關鍵字,但這裡還馬上不能出棧,因為調用了sumRange(num - 1) 即sumRange(2)
2、所以,sumRange(2) 壓棧,以此類推,sumRange(1) 壓棧,
3、最後, sumRange(1) 出棧回傳1,sumRange(2) 出棧,回傳2,sumRange(3) 出棧
4、所以3 2 1 結果為6
#看流程圖
所以,遞迴也是個壓棧出堆疊的過程。
遞迴可以用非遞歸表示,下面是上面遞歸例子等價執行
// for 循环 function multiple(num) { let total = 1; for (let i = num; i > 1; i--) { total *= i } return total } multiple(3)
4. 遞歸注意點
##如果上面範例修改一下,如下:function multiple(num) { if (num === 1) console.log(1) return num * multiple(num - 1) } multiple(3) // Error: Maximum call stack size exceeded上面程式碼第一行沒有return 關鍵字句子,因為遞迴沒有終止條件,所以會一直壓棧,造成記憶體洩漏。
遞迴容易出錯點
- 沒有設定終止點
- 除了遞迴,其他部分的程式碼
- 什麼時候遞迴合適
6. 練習題目
1、寫一個函數,接受一串字串,回傳一個字串,這個字串就是將原來字串倒過來。 2、寫一個函數,接受一串字串,同時從前後開始拿一位字元對比,如果兩個相等,則回傳 true,如果不等,則回傳 false。 3、寫一個函數,接受一個數組,並回傳扁平化新數組。 4、寫一個函數,接受一個對象,這個對象值是偶數,則讓它們相加,回傳這個總值。 5、寫一個函數,接受一個對象,回傳一個數組,這個數組包含對象裡所有的值是字串7.參考答案
參考1function reverse(str) { if(str.length 參考2<p></p><pre class="brush:php;toolbar:false">function isPalindrome(str){ if(str.length === 1) return true; if(str.length === 2) return str[0] === str[1]; if(str[0] === str.slice(-1)) return isPalindrome(str.slice(1,-1)) return false; } var str = 'abba' isPalindrome(str)參考3
function flatten (oldArr) { var newArr = [] for(var i = 0; i 參考4<p></p><pre class="brush:php;toolbar:false">function nestedEvenSum(obj, sum=0) { for (var key in obj) { if (typeof obj[key] === 'object'){ sum += nestedEvenSum(obj[key]); } else if (typeof obj[key] === 'number' && obj[key] % 2 === 0){ sum += obj[key]; } } return sum; } nestedEvenSum({c: 4,d: {a: 2, b:3}})參考5
function collectStrings(obj) { let newArr = [] for (let key in obj) { if (typeof obj[key] === 'string') { newArr.push(obj[key]) } else if(typeof obj[key] === 'object' && !Array.isArray(obj[key])) { newArr = newArr.concat(collectStrings(obj[key])) } } return newArr } var obj = { a: '1', b: { c: 2, d: 'dd' } } collectStrings(obj)
5. 總結
遞迴精髓是,往往要先想好常規部分是怎樣的,在考慮遞歸部分,下面是JavaScript 遞歸常用到的方法
數組:slice, concat
##字符串: slice, substr, substring
物件:Object.assign
以上是遞迴是什麼? javascript中遞歸的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

禪工作室 13.0.1
強大的PHP整合開發環境