摘要:二項(xiàng)目中用到的幾個(gè)經(jīng)典的遞歸求的和分析假設(shè)遞歸函數(shù)已經(jīng)寫好為,即,就是求的和。遞歸函數(shù)實(shí)現(xiàn)每天凌晨定時(shí)啟動(dòng)定時(shí)器執(zhí)行代碼分析假設(shè)遞歸函數(shù)已經(jīng)寫好了。
一、遞歸的概念
在程序中函數(shù)直接或者間接調(diào)用自身的一種方法,就叫做遞歸。它通常把一個(gè)大型復(fù)雜的問題轉(zhuǎn)化為一個(gè)與原問題相似的規(guī)模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程中所需要的多次重復(fù)計(jì)算,大大減少了程序的代碼了。
二、項(xiàng)目中用到的幾個(gè)經(jīng)典的遞歸1. 求1-100的和
分析:
假設(shè)遞歸函數(shù)已經(jīng)寫好為sum,即sum(100),就是求1-100的和。
尋找遞歸關(guān)系。sum(n)===sum(n-1)+n。
將臨界條件加入到遞歸中。sum(1)=1。
遞歸函數(shù)實(shí)現(xiàn)
function sum(n){ if(n===1){ return 1; } return sum(n-1)+n; } console.log(sum(100));
2. 每天凌晨定時(shí)啟動(dòng)定時(shí)器執(zhí)行代碼
分析:
假設(shè)遞歸函數(shù)已經(jīng)寫好了timerDay。
尋找遞歸關(guān)系,延遲多少時(shí)間遞歸一次
遞歸函數(shù)實(shí)現(xiàn)
function timerDay(functionname){ var date=new Date();//獲取當(dāng)前時(shí)刻 var nowday=date.getDate();//獲取當(dāng)前日期 var executionTime=new Date();//執(zhí)行時(shí)間 executionTime.setDate(nowday+1);//設(shè)置第二天凌晨0點(diǎn)20為執(zhí)行時(shí)間 executionTime.setHours(0); executionTime.setMinutes(0); executionTime.setSeconds(20); return setTimeout(function(){ functionname(); timerDay(functionname); },executionTime-date); } function fn(){//具體執(zhí)行什么內(nèi)容 console.log("現(xiàn)在凌晨0點(diǎn)20秒"); } var settimtout=timerDay(fn);
這個(gè)遞歸沒有臨界點(diǎn),是一個(gè)無線循環(huán)執(zhí)行的遞歸函數(shù),如果我們想停止遞歸,我們可以清楚延時(shí)定時(shí)器。
clearTimeout(settimtout);
3. 將一個(gè)數(shù)組按照內(nèi)容遞歸成樹形數(shù)組
分析:
定義樹形對(duì)象
得到根節(jié)點(diǎn)
得到子節(jié)點(diǎn)(得到子節(jié)點(diǎn)一級(jí)一級(jí)數(shù)據(jù)用到了遞歸)
var list = [{ id: 1, name: "一級(jí)分類:1", pid: 0, }, { id: 2, name: "二級(jí)分類:1", pid: 1, }, { id: 3, name: "三級(jí)分類:1", pid: 2, }, { id: 4, name: "一級(jí)分類:2", pid: 0, }]; function treeObj(originObj) { //定義樹形對(duì)象 var obj = {}; obj.id = originObj.id; obj.name = originObj.name; obj.pid = originObj.pid; obj["children"] = []; return obj; } function isRootNode(pid, list) { //判斷是否是根節(jié)點(diǎn) for (var i = 0; i < list.length; i++) { var item = list[i]; if (item && item.id === pid) { return false } } return true; } function getRootNodes(list) { //得到根節(jié)點(diǎn) 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) { //遍歷獲取子節(jié)點(diǎn) 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); //遞歸遍歷子節(jié)點(diǎn) } } return rootNodes; } var result = []; if (list === undefined || list.length === 0) { result = []; } else { var rootNodes = getRootNodes(list); result = getChildNodes(rootNodes, list); console.log(result); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96815.html
摘要:專題系列第十八篇,講解遞歸和尾遞歸定義程序調(diào)用自身的編程技巧稱為遞歸。然而非尾調(diào)用函數(shù),就會(huì)創(chuàng)建多個(gè)執(zhí)行上下文壓入執(zhí)行上下文棧。所以我們只用把階乘函數(shù)改造成一個(gè)尾遞歸形式,就可以避免創(chuàng)建那么多的執(zhí)行上下文。 JavaScript 專題系列第十八篇,講解遞歸和尾遞歸 定義 程序調(diào)用自身的編程技巧稱為遞歸(recursion)。 階乘 以階乘為例: function factorial(n...
摘要:高階函數(shù)函數(shù)式編程中,接受函數(shù)作為參數(shù),或者返回一個(gè)函數(shù)作為結(jié)果的函數(shù)通常就被稱為高階函數(shù)。均屬于高階函數(shù),高階函數(shù)并不神秘,我們?nèi)粘>幊桃矔?huì)用到。參考演算函數(shù)式編程指南入門康托爾哥德爾圖靈永恒的金色對(duì)角線原文函數(shù)與演算 緣起 造了一個(gè)輪子,根據(jù)GitHub項(xiàng)目地址,生成項(xiàng)目目錄樹,直觀的展現(xiàn)項(xiàng)目結(jié)構(gòu),以便于介紹項(xiàng)目。歡迎Star。 repository-tree 技術(shù)棧: ES6 ...
摘要:一旦我們滿足了基本條件值為,我們將不再調(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í)的梁柱;...
摘要:正文面試題重建二叉樹題目輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請(qǐng)重建出該二叉樹。前序遍歷序列為,中序遍歷序列,。確定了左右子樹后遞歸處理。方法方法面試題在時(shí)間刪除鏈表結(jié)點(diǎn)。 寫在前面 本文的題目均來自于劍指offer中的題目,題目序號(hào)保持了書中的題目序號(hào),由于某些題目并不適合于javascript這種語言,所以這些題目就沒有寫在本篇博客中,因此會(huì)出現(xiàn)題目序號(hào)的中斷。 正文 面試題6:...
摘要:第三次第四次設(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 ...
閱讀 1995·2023-04-26 01:59
閱讀 3296·2021-10-11 11:07
閱讀 3333·2021-09-22 15:43
閱讀 3414·2021-09-02 15:21
閱讀 2607·2021-09-01 10:49
閱讀 929·2019-08-29 15:15
閱讀 3121·2019-08-29 13:59
閱讀 2858·2019-08-26 13:36