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