摘要:遞歸函數(shù)就是會直接或者間接地調(diào)用自身的一種函數(shù)。一般來說,一個遞歸函數(shù)調(diào)用自身去解決它的子問題。書上第二個例子是說遞歸函數(shù)可以非常高效率的操作樹形結(jié)構(gòu),比如。有一些語言提供了尾遞歸的優(yōu)化。好運的是,給我們帶來了尾遞歸,詳細迎接使用尾遞歸。
遞歸函數(shù)就是會直接或者間接地調(diào)用自身的一種函數(shù)。遞歸是一種強大的編程技術,它把一問題分解為一組相似的子問題,每一個都用一個尋常解去解決。一般來說,一個遞歸函數(shù)調(diào)用自身去解決它的子問題。
書上的一個小例子“漢諾塔”。塔上有3根柱子和一個套直徑都不同的空心圓盤。開始時源柱子的所有圓盤都按照從小到大的順序堆疊。目標是每次移動一個圓盤到另一根柱子,最終把一堆圓盤移動到目標柱子上,期間不允許把較大的圓盤放在較小的圓盤上。
var hanoi = function(disc, src, aux, dst){ if (disc > 0) { hanoi(disc - 1, src, dst, aux); document.writeln("Move disc" + disc + " form " + src + " to " + dst); hanoi(disc - 1, aux, src, dst); } }; hanoi(3, "src", "aux", "dst");
運行代碼結(jié)果:
Move disc1 form src to dst Move disc2 form src to aux Move disc1 form dst to aux Move disc3 form src to dst Move disc1 form aux to src Move disc2 form aux to dst Move disc1 form src to dst
hanoi函數(shù)把一堆圓盤從一根柱子移動到另外一根柱子,必要使用輔助的柱子。它把該問題拆分成3個小問題。它先移動到一對圓盤中較小的圓盤到輔助柱子上,從而露出下面較大的圓盤,然后移動下面的圓盤到目標柱子上。最后,他將剛才較小的圓盤從輔助柱子上再移動到目標柱子上。通過遞推地調(diào)用自身去處理一堆圓盤的移動,從而解決那些問題。
傳遞給hanoi函數(shù)的參數(shù)包括當前移動的圓盤的編號和它將要用到的3根柱子。當它調(diào)用自身的時候,它去處理當前正在處理的圓盤之上的圓盤。最終,他會一個不存在的圓盤編號去調(diào)用。在這樣的情況下,他不執(zhí)行任何操作。由于該函數(shù)對非法只不理會,也不用擔心死循環(huán)的問題。
書上第二個例子是說遞歸函數(shù)可以非常高效率的操作樹形結(jié)構(gòu),比如DOM。每次遞歸調(diào)用是處理指定的樹的一小段。
// 它從某個指定的節(jié)點開始,按照 HTML 源碼中的順序訪問該數(shù)的每個節(jié)點。 var walk_the_DOM = function(node, func){ func(node); node = node.firstChild; while (node) { walk_the_DOM(node, func); node = node.nextSibling; } }; // 它調(diào)用 walk_the_DOM 函數(shù),傳遞一個用來查找節(jié)點屬性名的函數(shù)為參數(shù)。 // 匹配的節(jié)點會累加到一個結(jié)果數(shù)組里面。 var getElementsByAttribute = function(att, val){ var results = []; walk_the_DOM(document.body, function(node){ var actual = node.nodeType === 1 && node.getAttribute(att); if (typeof actual === "string" && (actual === val || typeof value != "string")) { results.push(node); } }); return results; };
有一些語言提供了尾遞歸的優(yōu)化。這意味著如果一個函數(shù)返回自身遞歸的結(jié)果,那么調(diào)用的過程會被替換成以循環(huán),可以提高速度。可惜js并沒有尾遞歸的優(yōu)化。
好運的是,ES6給我們帶來了尾遞歸,詳細迎接ECMAScript 6, 使用尾遞歸。
拓展:什么情況下用遞歸?。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/85587.html
摘要:對象被傳遞到從句中被捕獲。一些語言提供了尾遞歸優(yōu)化。這意味著如果一個函數(shù)返回自身遞歸調(diào)用的結(jié)果,那么調(diào)用的過程會被替換為一個循環(huán),可以顯著提高速度。構(gòu)建一個帶尾遞歸的函數(shù)。語言精粹讀書筆記函數(shù) 第四章 函數(shù) Functions (二) 參數(shù) arguments arguments數(shù)組: 函數(shù)可以通過此參數(shù)訪問所有它被調(diào)用時傳遞給它的參數(shù)列表,包括哪些沒有被分配給函數(shù)聲明時定義的形式參數(shù)...
摘要:對之前看高級程序設計時沒有注意到的一些知識點,結(jié)合本書做以補充語法注釋源于的型既可以出現(xiàn)在字符串字面量中,也可能出現(xiàn)在正則表達式字面量中,如故一般建議使用型注釋保留字語句變量參數(shù)屬性名運算符和標記等標識符不允許使用保留字,此外在對象字面量中 對之前看《JavaScript高級程序設計》時沒有注意到的一些知識點,結(jié)合本書做以補充 語法 注釋 源于PL/I的/* */型既可以出現(xiàn)在字符串字...
摘要:語言精粹讀書筆記第四章函數(shù)函數(shù)字面量函數(shù)字面量包含個部分第一部分,保留字第二部分,函數(shù)名,它可以被忽略。這個超級延遲綁定使得函數(shù)對高度復用。構(gòu)造器調(diào)用模式一個函數(shù),如果創(chuàng)建的目的就是希望結(jié)合的前綴來調(diào)用,那它就被稱為構(gòu)造器構(gòu)造。 《JavaScript 語言精粹》 讀書筆記 第四章 函數(shù) Functions 函數(shù)字面量 函數(shù)字面量包含4個部分: 第一部分, 保留字 function...
摘要:于是我就先把這本薄的經(jīng)典書語言精粹修訂版豆瓣讀書本書簡介總共章,除去附錄,才頁,讀完并記錄了一些筆記。讀書筆記還可以分享給別人看。編程語言第版定義了的標準。程序檢查時丟棄值為函數(shù)的屬性。 之前看到這篇文章,前端網(wǎng)老姚淺談:怎么學JavaScript?,說到怎么學習JavaScript,那就是看書、分析源碼。10本書讀2遍的好處,應該大于一本書讀20遍。看書主動學習,看視頻是被動學習。看...
摘要:但采用構(gòu)造器調(diào)用模式,即是使用了前綴去調(diào)用一個函數(shù)時,函數(shù)執(zhí)行的方式會改變。對象包含構(gòu)造器需要構(gòu)造一個新的實例的所有信息。構(gòu)造器的變量和內(nèi)部函數(shù)變成了該實例的私有成員。 JavaScript 是一門弱類型語言,從不需要類型轉(zhuǎn)換。對象繼承關系變得無關緊要。對于一個對象來說重要的時它能夠做什么,而不是它從哪里來。 閱讀《javascript語言精粹》筆記! 偽類 js的原型存...
閱讀 2959·2023-04-25 17:46
閱讀 3588·2021-11-25 09:43
閱讀 1092·2021-11-18 10:02
閱讀 3051·2021-10-14 09:43
閱讀 2768·2021-10-13 09:40
閱讀 1524·2021-09-28 09:35
閱讀 2184·2019-08-30 15:52
閱讀 3154·2019-08-30 14:06