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