摘要:遞歸的概念在程序中函數(shù)直接或間接調(diào)用自己注意使用遞歸函數(shù)一定要注意,處理不當(dāng)就會(huì)進(jìn)入死循環(huán)。遞歸函數(shù)只有在特定的情況下使用,比如階乘問題。使用是一個(gè)指向正在執(zhí)行的函數(shù)的指針,返回正在被執(zhí)行的對(duì)現(xiàn)象。
程序員不止眼前的邏輯和代碼,還有底層的框架與架構(gòu)。1. 前言
最近在做一個(gè)復(fù)雜表格設(shè)計(jì)數(shù)據(jù)格式設(shè)置,其中用到了多叉樹的原理,所以要用到遞歸來(lái)實(shí)現(xiàn)數(shù)據(jù)格式化。
2. 遞歸的概念在程序中函數(shù)直接或間接調(diào)用自己
注意:使用遞歸函數(shù)一定要注意,處理不當(dāng)就會(huì)進(jìn)入死循環(huán)。遞歸函數(shù)只有在特定的情況下使用 ,比如階乘問題。
3. 例子 1. 一個(gè)階乘的例子:function fact(num) { if (num <= 1) { return 1; } else { return num * fact(num - 1); } } fact(3) // 結(jié)果為 6
以下代碼可導(dǎo)致出錯(cuò):
var anotherFact = fact; fact = null; alert(antherFact(4)); //出錯(cuò)
由于fact已經(jīng)不是函數(shù)了,所以出錯(cuò)。
使用arguments.callee
arguments.callee 是一個(gè)指向正在執(zhí)行的函數(shù)的指針,arguments.callee 返回正在被執(zhí)行的對(duì)現(xiàn)象。
新的函數(shù)為:
function fact(num){ if (num<=1){ return 1; }else{ return num*arguments.callee(num-1); //此處更改了。 } } var anotherFact = fact; fact = null; alert(antherFact(4)); //結(jié)果為24.2.再看一個(gè)多叉樹的例子:
先看圖
數(shù)據(jù)結(jié)構(gòu)格式,參考如下代碼:
headerData: { name: "總數(shù)據(jù)", children: [ { name: "數(shù)據(jù)1", children: [ { name: "數(shù)據(jù)11", children: [ { name: "數(shù)據(jù)111", }, { name: "數(shù)據(jù)112", } ] }, { name: "數(shù)據(jù)12", children: [ { name: "數(shù)據(jù)121", }, { name: "數(shù)據(jù)122", } ] }, { name: "數(shù)據(jù)13", children: [ { name: "數(shù)據(jù)131", }, { name: "數(shù)據(jù)132", } ] }, { name: "數(shù)據(jù)14", }, ] } ] }
我們?nèi)绾潍@取節(jié)點(diǎn)的所有葉子節(jié)點(diǎn)個(gè)數(shù)呢? 遞歸代碼如下:
/** * 獲取 節(jié)點(diǎn)的所有 葉子節(jié)點(diǎn) 個(gè)數(shù) * @param {Object} json Object對(duì)象 */ function getLeafCountTree(json) { if(!json.children){ return 1; }else{ var leafCount = 0; for(var i = 0 ; i < json.children.length ; i++){ leafCount = leafCount + getLeafCountTree(json.children[i]); } return leafCount; } }最后
遞歸遍歷是比較常用的方法,比如:省市區(qū)遍歷成樹、多叉樹、階乘等。
希望本文對(duì)你有點(diǎn)幫助。
你以為本文就這么結(jié)束了 ? 精彩在后面 !!!
對(duì) 全棧修煉 有興趣的朋友可以掃下方二維碼關(guān)注我的公眾號(hào)
我會(huì)不定期更新有價(jià)值的內(nèi)容,長(zhǎng)期運(yùn)營(yíng)。
關(guān)注公眾號(hào)并回復(fù) 福利 可領(lǐng)取免費(fèi)學(xué)習(xí)資料,福利詳情請(qǐng)猛戳: Python、Java、Linux、Go、node、vue、react、javaScript
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/96415.html
摘要:第三次第四次設(shè)想,如果傳入的參數(shù)值特別大,那么這個(gè)調(diào)用棧將會(huì)非常之大,最終可能超出調(diào)用棧的緩存大小而崩潰導(dǎo)致程序執(zhí)行失敗。注意尾遞歸不一定會(huì)將你的代碼執(zhí)行速度提高相反,可能會(huì)變慢。 譯者按: 程序員應(yīng)該知道遞歸,但是你真的知道是怎么回事么? 原文: All About Recursion, PTC, TCO and STC in JavaScript 譯者: Fundebug ...
摘要:每個(gè)函數(shù)調(diào)用都將開辟出一小塊稱為堆棧幀的內(nèi)存。當(dāng)?shù)诙€(gè)函數(shù)開始執(zhí)行,堆棧幀增加到個(gè)。當(dāng)這個(gè)函數(shù)調(diào)用結(jié)束后,它的幀會(huì)從堆棧中退出。保持堆棧幀跟蹤函數(shù)調(diào)用的狀態(tài),并將其分派給下一個(gè)遞歸調(diào)用迭。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTM...
這兩天搜了下JS遞歸的相關(guān)文章, 覺得這篇文章很不錯(cuò), 就順手翻譯了下,也算給自己做個(gè)筆記,題目是我自己加的。原文很長(zhǎng),寫得也很詳盡,這里并非逐字翻譯, 而是作者所講的主要概念加上我自己的一些理解,本文中解決方案的實(shí)際意義并不是特別大,但算法的邏輯挺有意思,不過也略抽象,理解需要花點(diǎn)時(shí)間(囧,估計(jì)我太閑了) 文中的用例?全部來(lái)自原文: 原文鏈接:(原題為:理解JS函數(shù)式編程中的遞歸)Underst...
摘要:貌似大部分語(yǔ)言中的遞歸都差不多,之所以在標(biāo)題加是因?yàn)樗蚜讼潞蟾杏X網(wǎng)上用來(lái)描述這概念的不多,簡(jiǎn)單地說(shuō)遞歸就是函數(shù)調(diào)用自己的過程。 貌似大部分語(yǔ)言中的遞歸都差不多, 之所以在標(biāo)題加JS是因?yàn)樗蚜讼潞蟾杏X網(wǎng)上用js來(lái)描述這概念的不多, 簡(jiǎn)單地說(shuō)遞歸就是函數(shù)調(diào)用自己的過程。下面的栗子可以很直觀地展示遞歸的執(zhí)行過程: function rec(x){ if(x!==1){ console....
摘要:一旦我們滿足了基本條件值為,我們將不再調(diào)用遞歸函數(shù),只是有效地執(zhí)行了。遞歸深諳函數(shù)式編程之精髓,最被廣泛引證的原因是,在調(diào)用棧中,遞歸把大部分顯式狀態(tài)跟蹤換為了隱式狀態(tài)。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅(jiān)實(shí)的梁柱;...
摘要:在遞歸過程中,未完成計(jì)算的函數(shù)將會(huì)掛起壓入調(diào)用堆棧,不然遞歸結(jié)束的時(shí)候沒辦法進(jìn)行回溯。這就引出了回溯法回溯法就是在達(dá)到遞歸邊界前的某層,由于一些事實(shí)導(dǎo)致已經(jīng)不需要前往任何一個(gè)子問題遞歸,就可以直接返回上一層。 1簡(jiǎn)介 遞歸在前端開發(fā)中應(yīng)用還是非常廣泛的,首先DOM就是樹狀結(jié)構(gòu),而這種結(jié)構(gòu)使用遞歸去遍歷是非常合適的。然后就是對(duì)象和數(shù)組的深復(fù)制很多庫(kù)也是使用遞歸實(shí)現(xiàn)的例如jquery中的e...
閱讀 2830·2021-09-10 10:50
閱讀 2192·2019-08-29 16:06
閱讀 3196·2019-08-29 11:02
閱讀 1093·2019-08-26 14:04
閱讀 2803·2019-08-26 13:24
閱讀 2301·2019-08-26 12:16
閱讀 550·2019-08-26 10:29
閱讀 3094·2019-08-23 18:33