成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

一個(gè)遞歸函數(shù)的漏洞及優(yōu)化

Riddler / 681人閱讀

摘要:下面函數(shù)采用了遞歸如果文字超出寬度,在函數(shù)中將原字符截?cái)嗄┪沧址⒓由显俅握{(diào)用判斷是否超出寬度。直至獲得寬度合適的字符串并輸出。需要優(yōu)化的遞歸函數(shù)超出寬度這樣看起來(lái)沒(méi)問(wèn)題。其實(shí)需要優(yōu)化很多地方。

現(xiàn)在有一個(gè)需求:

如果“一個(gè)字符串”超出“容器寬度”,將字符串截?cái)嘧詈笠粋€(gè)字符、并在末尾加上‘...’ ,再次判斷是否需要截?cái)?。直至字符串小于容器寬度?/p>

下面SliceLabelStr函數(shù)采用了遞歸:
如果文字超出寬度,在attrStyle函數(shù)中將原字符截?cái)嗄┪沧址⒓由稀?..’ 再次調(diào)用sliceLabelStr判斷是否超出寬度。
直至獲得寬度合適的字符串并輸出。

需要優(yōu)化的遞歸函數(shù)
sliceLabelStr = function( textWidth, textStr) {
    var str;
   
    if(超出寬度) {
        dataLabel2 = attrStyle(textStr);
        var newTextWidth =  dataLabel2.text && dataLabel2.text.element.getBoundingClientRect().width;
        var textStr = dataLabel2.text.textStr;
        sliceLabelStr( newTextWidth, textStr);
    } else {
        str = attrStyle(textStr, true);
        return str; 
    }  
}

這樣看起來(lái)沒(méi)問(wèn)題。其實(shí)需要優(yōu)化很多地方。

1、遞歸沒(méi)有出口

這個(gè)遞歸函數(shù)被調(diào)用了10遍,在11遍的時(shí)候符合了出口條件退出了,
那么在第10遍沒(méi)退出的時(shí)候,1到10次的函數(shù)都沒(méi)有退出,只有在第11遍符合了出口條件return了以后,就會(huì)從11~1倒著依次退出

附上一張?zhí)?yáng)神手寫的解釋圖

優(yōu)化方法1
if(textWidth > containerWidth) {
        dataLabel2 = attrStyle(textStr);
        var newTextWidth =  dataLabel2.text && dataLabel2.text.element.getBoundingClientRect().width;
        var textStr = dataLabel2.text.textStr;
        return sliceLabelStr( newTextWidth, textStr);//有返回值
    } 

1、上述原因是遞歸沒(méi)有出口,而且if語(yǔ)句中調(diào)用本函數(shù)遞歸的時(shí)候沒(méi)有返回值。

2、有時(shí)會(huì)產(chǎn)生“調(diào)用棧溢出”的情況。

2、在if判斷條件中,由于在某種情況下textWidth沒(méi)有變化造成了無(wú)限遞歸

3、用do...while 代替 遞歸

sliceLabelStr = function(forX2Array, textWidth, textStr) {
    var str,
        sliceStr = textStr.text && textStr.text.textStr || textStr;

    if(compareTextLength(forX2Array, textWidth)) {
        var n=0;

        do{
            n++;
        }
        while(sliceStr.substr(0,n)!=sliceStr && attrLabel2Style(forX2Array[0], sliceStr.substr(0,n)).getBBox()["width"]

邏輯比較直觀,簡(jiǎn)單能用循環(huán)的就用循環(huán),遞歸一般用在復(fù)雜算法,比如弗洛伊德,A+之類

4、這是SVGElement,如果是普通的DOM元素。可以用如下方法。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/81474.html

相關(guān)文章

  • 什么是編程基本功?

    摘要:正是前人的努力,我們現(xiàn)在的編程才會(huì)如此的容易。讀懂他人代碼算法如果別人是大牛,數(shù)學(xué)學(xué)得很好,很多數(shù)學(xué)公式,很多遞歸,如果自己沒(méi)有一定的數(shù)學(xué)基礎(chǔ),可能就暈了,這個(gè)時(shí)候,數(shù)學(xué)的基本功可能就會(huì)在這里發(fā)揮作用了。 作者:caoglish原文鏈接:http://t.cn/RKcyGX3來(lái)源:知乎 查詢和閱讀文檔能力 原因:你使用編程來(lái)解決問(wèn)題的時(shí)候,基本上最終的東西是代碼,但是編程的知識(shí)太廣,總...

    Acceml 評(píng)論0 收藏0
  • 什么是編程基本功?

    摘要:正是前人的努力,我們現(xiàn)在的編程才會(huì)如此的容易。讀懂他人代碼算法如果別人是大牛,數(shù)學(xué)學(xué)得很好,很多數(shù)學(xué)公式,很多遞歸,如果自己沒(méi)有一定的數(shù)學(xué)基礎(chǔ),可能就暈了,這個(gè)時(shí)候,數(shù)學(xué)的基本功可能就會(huì)在這里發(fā)揮作用了。 作者:caoglish原文鏈接:http://t.cn/RKcyGX3來(lái)源:知乎 查詢和閱讀文檔能力 原因:你使用編程來(lái)解決問(wèn)題的時(shí)候,基本上最終的東西是代碼,但是編程的知識(shí)太廣,總...

    lansheng228 評(píng)論0 收藏0
  • 什么是編程基本功?

    摘要:正是前人的努力,我們現(xiàn)在的編程才會(huì)如此的容易。讀懂他人代碼算法如果別人是大牛,數(shù)學(xué)學(xué)得很好,很多數(shù)學(xué)公式,很多遞歸,如果自己沒(méi)有一定的數(shù)學(xué)基礎(chǔ),可能就暈了,這個(gè)時(shí)候,數(shù)學(xué)的基本功可能就會(huì)在這里發(fā)揮作用了。 作者:caoglish原文鏈接:http://t.cn/RKcyGX3來(lái)源:知乎 查詢和閱讀文檔能力 原因:你使用編程來(lái)解決問(wèn)題的時(shí)候,基本上最終的東西是代碼,但是編程的知識(shí)太廣,總...

    bbbbbb 評(píng)論0 收藏0
  • 什么是編程基本功?

    摘要:正是前人的努力,我們現(xiàn)在的編程才會(huì)如此的容易。讀懂他人代碼算法如果別人是大牛,數(shù)學(xué)學(xué)得很好,很多數(shù)學(xué)公式,很多遞歸,如果自己沒(méi)有一定的數(shù)學(xué)基礎(chǔ),可能就暈了,這個(gè)時(shí)候,數(shù)學(xué)的基本功可能就會(huì)在這里發(fā)揮作用了。 作者:caoglish原文鏈接:http://t.cn/RKcyGX3來(lái)源:知乎 查詢和閱讀文檔能力 原因:你使用編程來(lái)解決問(wèn)題的時(shí)候,基本上最終的東西是代碼,但是編程的知識(shí)太廣,總...

    william 評(píng)論0 收藏0
  • [PHP] – 性能優(yōu)化 – Fcgi進(jìn)程PHP解析優(yōu)化(1)

    摘要:是否啟用安全模式。提示此參數(shù)已經(jīng)沒(méi)有了關(guān)閉危險(xiǎn)函數(shù)如果打開(kāi)了安全模式,那么函數(shù)禁止是不需要的,但是我們?yōu)榱税踩紤]還是設(shè)置。 1、PHP引擎緩存加速常見(jiàn)四種軟件:1.eAccelerator2.Zendcache3.xcache4.apc5.zendopcache php5.5自帶2、使用tmpfs作為緩存加速緩存的文件目錄[root@web02 ~]# mount -t tmpfs ...

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

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

0條評(píng)論

閱讀需要支付1元查看
<