成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

《javascript語言精粹》學(xué)習(xí)筆記 - 遞歸函數(shù)

Ryan_Li / 3394人閱讀

摘要:遞歸函數(shù)就是會(huì)直接或者間接地調(diào)用自身的一種函數(shù)。一般來說,一個(gè)遞歸函數(shù)調(diào)用自身去解決它的子問題。書上第二個(gè)例子是說遞歸函數(shù)可以非常高效率的操作樹形結(jié)構(gòu),比如。有一些語言提供了尾遞歸的優(yōu)化。好運(yùn)的是,給我們帶來了尾遞歸,詳細(xì)迎接使用尾遞歸。

  

遞歸函數(shù)就是會(huì)直接或者間接地調(diào)用自身的一種函數(shù)。遞歸是一種強(qiáng)大的編程技術(shù),它把一問題分解為一組相似的子問題,每一個(gè)都用一個(gè)尋常解去解決。一般來說,一個(gè)遞歸函數(shù)調(diào)用自身去解決它的子問題。

書上的一個(gè)小例子“漢諾塔”。塔上有3根柱子和一個(gè)套直徑都不同的空心圓盤。開始時(shí)源柱子的所有圓盤都按照從小到大的順序堆疊。目標(biāo)是每次移動(dòng)一個(gè)圓盤到另一根柱子,最終把一堆圓盤移動(dòng)到目標(biāo)柱子上,期間不允許把較大的圓盤放在較小的圓盤上。

 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");

運(yùn)行代碼結(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ù)把一堆圓盤從一根柱子移動(dòng)到另外一根柱子,必要使用輔助的柱子。它把該問題拆分成3個(gè)小問題。它先移動(dòng)到一對(duì)圓盤中較小的圓盤到輔助柱子上,從而露出下面較大的圓盤,然后移動(dòng)下面的圓盤到目標(biāo)柱子上。最后,他將剛才較小的圓盤從輔助柱子上再移動(dòng)到目標(biāo)柱子上。通過遞推地調(diào)用自身去處理一堆圓盤的移動(dòng),從而解決那些問題。

傳遞給hanoi函數(shù)的參數(shù)包括當(dāng)前移動(dòng)的圓盤的編號(hào)和它將要用到的3根柱子。當(dāng)它調(diào)用自身的時(shí)候,它去處理當(dāng)前正在處理的圓盤之上的圓盤。最終,他會(huì)一個(gè)不存在的圓盤編號(hào)去調(diào)用。在這樣的情況下,他不執(zhí)行任何操作。由于該函數(shù)對(duì)非法只不理會(huì),也不用擔(dān)心死循環(huán)的問題。

書上第二個(gè)例子是說遞歸函數(shù)可以非常高效率的操作樹形結(jié)構(gòu),比如DOM。每次遞歸調(diào)用是處理指定的樹的一小段。

// 它從某個(gè)指定的節(jié)點(diǎn)開始,按照 HTML 源碼中的順序訪問該數(shù)的每個(gè)節(jié)點(diǎn)。
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ù),傳遞一個(gè)用來查找節(jié)點(diǎn)屬性名的函數(shù)為參數(shù)。
// 匹配的節(jié)點(diǎn)會(huì)累加到一個(gè)結(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)化。這意味著如果一個(gè)函數(shù)返回自身遞歸的結(jié)果,那么調(diào)用的過程會(huì)被替換成以循環(huán),可以提高速度??上?b>js并沒有尾遞歸的優(yōu)化。

  

好運(yùn)的是,ES6給我們帶來了尾遞歸,詳細(xì)迎接ECMAScript 6, 使用尾遞歸。
拓展:什么情況下用遞歸?。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85587.html

相關(guān)文章

  • JavaScript 語言精粹》 讀書筆記 - 函數(shù)(二)

    摘要:對(duì)象被傳遞到從句中被捕獲。一些語言提供了尾遞歸優(yōu)化。這意味著如果一個(gè)函數(shù)返回自身遞歸調(diào)用的結(jié)果,那么調(diào)用的過程會(huì)被替換為一個(gè)循環(huán),可以顯著提高速度。構(gòu)建一個(gè)帶尾遞歸的函數(shù)。語言精粹讀書筆記函數(shù) 第四章 函數(shù) Functions (二) 參數(shù) arguments arguments數(shù)組: 函數(shù)可以通過此參數(shù)訪問所有它被調(diào)用時(shí)傳遞給它的參數(shù)列表,包括哪些沒有被分配給函數(shù)聲明時(shí)定義的形式參數(shù)...

    lufficc 評(píng)論0 收藏0
  • 【閱讀筆記JavaScript語言精粹

    摘要:對(duì)之前看高級(jí)程序設(shè)計(jì)時(shí)沒有注意到的一些知識(shí)點(diǎn),結(jié)合本書做以補(bǔ)充語法注釋源于的型既可以出現(xiàn)在字符串字面量中,也可能出現(xiàn)在正則表達(dá)式字面量中,如故一般建議使用型注釋保留字語句變量參數(shù)屬性名運(yùn)算符和標(biāo)記等標(biāo)識(shí)符不允許使用保留字,此外在對(duì)象字面量中 對(duì)之前看《JavaScript高級(jí)程序設(shè)計(jì)》時(shí)沒有注意到的一些知識(shí)點(diǎn),結(jié)合本書做以補(bǔ)充 語法 注釋 源于PL/I的/* */型既可以出現(xiàn)在字符串字...

    cucumber 評(píng)論0 收藏0
  • JavaScript 語言精粹》讀書筆記 - 函數(shù)

    摘要:語言精粹讀書筆記第四章函數(shù)函數(shù)字面量函數(shù)字面量包含個(gè)部分第一部分,保留字第二部分,函數(shù)名,它可以被忽略。這個(gè)超級(jí)延遲綁定使得函數(shù)對(duì)高度復(fù)用。構(gòu)造器調(diào)用模式一個(gè)函數(shù),如果創(chuàng)建的目的就是希望結(jié)合的前綴來調(diào)用,那它就被稱為構(gòu)造器構(gòu)造。 《JavaScript 語言精粹》 讀書筆記 第四章 函數(shù) Functions 函數(shù)字面量 函數(shù)字面量包含4個(gè)部分: 第一部分, 保留字 function...

    wdzgege 評(píng)論0 收藏0
  • JavaScript語言精粹 修訂版》 讀書筆記

    摘要:于是我就先把這本薄的經(jīng)典書語言精粹修訂版豆瓣讀書本書簡(jiǎn)介總共章,除去附錄,才頁,讀完并記錄了一些筆記。讀書筆記還可以分享給別人看。編程語言第版定義了的標(biāo)準(zhǔn)。程序檢查時(shí)丟棄值為函數(shù)的屬性。 之前看到這篇文章,前端網(wǎng)老姚淺談:怎么學(xué)JavaScript?,說到怎么學(xué)習(xí)JavaScript,那就是看書、分析源碼。10本書讀2遍的好處,應(yīng)該大于一本書讀20遍??磿鲃?dòng)學(xué)習(xí),看視頻是被動(dòng)學(xué)習(xí)???..

    EscapedDog 評(píng)論0 收藏0
  • javascript語言精粹學(xué)習(xí)筆記 - 繼承

    摘要:但采用構(gòu)造器調(diào)用模式,即是使用了前綴去調(diào)用一個(gè)函數(shù)時(shí),函數(shù)執(zhí)行的方式會(huì)改變。對(duì)象包含構(gòu)造器需要構(gòu)造一個(gè)新的實(shí)例的所有信息。構(gòu)造器的變量和內(nèi)部函數(shù)變成了該實(shí)例的私有成員。 JavaScript 是一門弱類型語言,從不需要類型轉(zhuǎn)換。對(duì)象繼承關(guān)系變得無關(guān)緊要。對(duì)于一個(gè)對(duì)象來說重要的時(shí)它能夠做什么,而不是它從哪里來。 閱讀《javascript語言精粹》筆記! 偽類 js的原型存...

    harriszh 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<