摘要:二項目中用到的幾個經典的遞歸求的和分析假設遞歸函數已經寫好為,即,就是求的和。遞歸函數實現每天凌晨定時啟動定時器執行代碼分析假設遞歸函數已經寫好了。
一、遞歸的概念
在程序中函數直接或者間接調用自身的一種方法,就叫做遞歸。它通常把一個大型復雜的問題轉化為一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程中所需要的多次重復計算,大大減少了程序的代碼了。
二、項目中用到的幾個經典的遞歸1. 求1-100的和
分析:
假設遞歸函數已經寫好為sum,即sum(100),就是求1-100的和。
尋找遞歸關系。sum(n)===sum(n-1)+n。
將臨界條件加入到遞歸中。sum(1)=1。
遞歸函數實現
function sum(n){ if(n===1){ return 1; } return sum(n-1)+n; } console.log(sum(100));
2. 每天凌晨定時啟動定時器執行代碼
分析:
假設遞歸函數已經寫好了timerDay。
尋找遞歸關系,延遲多少時間遞歸一次
遞歸函數實現
function timerDay(functionname){ var date=new Date();//獲取當前時刻 var nowday=date.getDate();//獲取當前日期 var executionTime=new Date();//執行時間 executionTime.setDate(nowday+1);//設置第二天凌晨0點20為執行時間 executionTime.setHours(0); executionTime.setMinutes(0); executionTime.setSeconds(20); return setTimeout(function(){ functionname(); timerDay(functionname); },executionTime-date); } function fn(){//具體執行什么內容 console.log("現在凌晨0點20秒"); } var settimtout=timerDay(fn);
這個遞歸沒有臨界點,是一個無線循環執行的遞歸函數,如果我們想停止遞歸,我們可以清楚延時定時器。
clearTimeout(settimtout);
3. 將一個數組按照內容遞歸成樹形數組
分析:
定義樹形對象
得到根節點
得到子節點(得到子節點一級一級數據用到了遞歸)
var list = [{ id: 1, name: "一級分類:1", pid: 0, }, { id: 2, name: "二級分類:1", pid: 1, }, { id: 3, name: "三級分類:1", pid: 2, }, { id: 4, name: "一級分類:2", pid: 0, }]; function treeObj(originObj) { //定義樹形對象 var obj = {}; obj.id = originObj.id; obj.name = originObj.name; obj.pid = originObj.pid; obj["children"] = []; return obj; } function isRootNode(pid, list) { //判斷是否是根節點 for (var i = 0; i < list.length; i++) { var item = list[i]; if (item && item.id === pid) { return false } } return true; } function getRootNodes(list) { //得到根節點 var rootNodes = []; for (var i = 0; i < list.length; i++) { var item = list[i]; if (isRootNode(item.pid, list)) { rootNodes.push(treeObj(item)); } } return rootNodes; } function getChildNodes(rootNodes, list) { //遍歷獲取子節點 if (list.length !== 0) { for (var i = 0; i < rootNodes.length; i++) { for (var j = 0; j < list.length; j++) { if (rootNodes[i].id === list[j].pid) { rootNodes[i].children.push(treeObj(list[j])); } } getChildNodes(rootNodes[i].children, list); //遞歸遍歷子節點 } } return rootNodes; } var result = []; if (list === undefined || list.length === 0) { result = []; } else { var rootNodes = getRootNodes(list); result = getChildNodes(rootNodes, list); console.log(result); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96815.html
摘要:專題系列第十八篇,講解遞歸和尾遞歸定義程序調用自身的編程技巧稱為遞歸。然而非尾調用函數,就會創建多個執行上下文壓入執行上下文棧。所以我們只用把階乘函數改造成一個尾遞歸形式,就可以避免創建那么多的執行上下文。 JavaScript 專題系列第十八篇,講解遞歸和尾遞歸 定義 程序調用自身的編程技巧稱為遞歸(recursion)。 階乘 以階乘為例: function factorial(n...
摘要:高階函數函數式編程中,接受函數作為參數,或者返回一個函數作為結果的函數通常就被稱為高階函數。均屬于高階函數,高階函數并不神秘,我們日常編程也會用到。參考演算函數式編程指南入門康托爾哥德爾圖靈永恒的金色對角線原文函數與演算 緣起 造了一個輪子,根據GitHub項目地址,生成項目目錄樹,直觀的展現項目結構,以便于介紹項目。歡迎Star。 repository-tree 技術棧: ES6 ...
摘要:一旦我們滿足了基本條件值為,我們將不再調用遞歸函數,只是有效地執行了。遞歸深諳函數式編程之精髓,最被廣泛引證的原因是,在調用棧中,遞歸把大部分顯式狀態跟蹤換為了隱式狀態。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關于譯者:這是一個流淌著滬江血液的純粹工程:認真,是 HTML 最堅實的梁柱;...
摘要:正文面試題重建二叉樹題目輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。前序遍歷序列為,中序遍歷序列,。確定了左右子樹后遞歸處理。方法方法面試題在時間刪除鏈表結點。 寫在前面 本文的題目均來自于劍指offer中的題目,題目序號保持了書中的題目序號,由于某些題目并不適合于javascript這種語言,所以這些題目就沒有寫在本篇博客中,因此會出現題目序號的中斷。 正文 面試題6:...
摘要:第三次第四次設想,如果傳入的參數值特別大,那么這個調用棧將會非常之大,最終可能超出調用棧的緩存大小而崩潰導致程序執行失敗。注意尾遞歸不一定會將你的代碼執行速度提高相反,可能會變慢。 譯者按: 程序員應該知道遞歸,但是你真的知道是怎么回事么? 原文: All About Recursion, PTC, TCO and STC in JavaScript 譯者: Fundebug ...
閱讀 1949·2023-04-26 01:59
閱讀 3264·2021-10-11 11:07
閱讀 3295·2021-09-22 15:43
閱讀 3374·2021-09-02 15:21
閱讀 2549·2021-09-01 10:49
閱讀 901·2019-08-29 15:15
閱讀 3089·2019-08-29 13:59
閱讀 2829·2019-08-26 13:36