云課堂作業(yè)--斐波那契數(shù)列引發(fā)的思索

前端微專業(yè)JavaScript有一道題目是求斐波那契數(shù)列的沼撕,一開始沒想很多渔隶,覺得實(shí)現(xiàn)功能自己已經(jīng)很棒棒了(逃~~~)
后面有同學(xué)討論直接遞歸特別耗費(fèi)時(shí)間御蒲,開始考慮使用閉包,看我們討論的不亦樂乎的大佬也發(fā)話了平委,指點(diǎn)我們這兩種方式都不是很好,讓我們?nèi)タ匆幌挛策f歸(實(shí)話說夺谁,我早就還給大學(xué)老師了=廉赔。=)
言歸正傳,開始干活匾鸥。
------------------------------假裝我是分割線---------------------------
如題:

image.png

我最開始的解法是直接遞歸

function sum(n){
        if(n==0){
            return 0;
        }else if(n==1) {
            return 1;
        }
        else{
            return (arguments.callee(n-1)+arguments.callee(n-2));
           }
      }

這個(gè)實(shí)現(xiàn)簡(jiǎn)單明了就是執(zhí)行速度太慢了蜡塌,因?yàn)榫幾g器是以如下方式進(jìn)行計(jì)算的(例如計(jì)算Fib(6)):

Fib(6) = Fib(5) + Fib(4);
         = Fib(4) + Fib(3) + Fib(3) + Fib(2);
         = Fib(3) + Fib(2) + Fib(2) + Fib(1) + Fib(2) + Fib(1) + Fib(2);
         = Fib(2) + Fib(1) + Fib(2) + Fib(2) + Fib(1) + Fib(2) + Fib(1) + Fib(2);
         = 8

從上面的遞歸展開式可以看出Fib(4),Fib(3)都被計(jì)算了2次,而且遞歸函數(shù)以2的指數(shù)增長(zhǎng)勿负。所以當(dāng)計(jì)算到30時(shí)就變得非常慢馏艾。(當(dāng)然這都是后話了,我開始哪里知道這么多~)

后來群里同學(xué)說使用閉包會(huì)比直接遞歸快奴愉,那我就試著用了下閉包琅摩;

var sum =(function (){
        return function(n){
            if(n==0 || n==1){
                return n;
            }else{
                return (sum(n-1)+sum(n-2));
               }
        }})();

使用了閉包確實(shí)感覺自己吊了一點(diǎn)啊,整個(gè)人都萌萌噠锭硼,而且后面測(cè)試速度也證實(shí)了比我原來的好一點(diǎn)房资。

后面, 大佬指導(dǎo)說直接遞歸和閉包都很影響性能(我實(shí)現(xiàn)出來都很不容易呀)檀头,告訴我們使用尾遞歸會(huì)極大的提高性能轰异,好吧,我只好去查查什么是尾遞歸了暑始,看了幾個(gè)demo我寫了如下代碼:

    function sum(n,a,b){
             if (n ==0 ){
                return a;
             }
             else{
                return sum(n-1, b, a +b);
            }
    }

具體執(zhí)行過程我后面會(huì)給傳送門溉浙,我也是從那看到的。

---------------------------------分割線又來了--------------------------------

接下來我們來對(duì)比一下代碼性能

直接遞歸的耗時(shí):

image.png

分別比較了n為30,33,35的值時(shí)候的耗時(shí)蒋荚,圖中有兩個(gè)數(shù)字戳稽,上面的是計(jì)算得到的斐波那契數(shù)列結(jié)果,下面是耗時(shí),單位是毫秒惊奇。

閉包

image.png

尾遞歸

image.png

循環(huán)

image.png

迭代實(shí)現(xiàn)

//使用Java方式互躬,主要是看實(shí)現(xiàn)思想
public static long fibo3(long n){    
    if(n<2) return n;    
    long pre=1,prepre=1,ret=0;    
    for(int i=2;i<n;i++){    
        ret=pre+prepre;    
        prepre=pre;    
        pre=ret;    
    }    
    return ret;    
}  

從圖中我們可以很明顯的看出,使用尾遞歸計(jì)算斐波那契數(shù)列性能完勝直接遞歸和閉包颂郎,特別是當(dāng)數(shù)值比較大的時(shí)候吼渡,尾遞歸的作用就越明顯。循環(huán)的方式性能也很好乓序,其實(shí)實(shí)現(xiàn)斐波那契數(shù)列方式多種多樣寺酪,真的只是你想不到而已,好了替劈,收工吃飯寄雀!

最后想看尾遞歸算法的可以看這里:尾遞歸實(shí)現(xiàn)斐波那契

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市陨献,隨后出現(xiàn)的幾起案子盒犹,更是在濱河造成了極大的恐慌,老刑警劉巖眨业,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件急膀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡龄捡,警方通過查閱死者的電腦和手機(jī)卓嫂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聘殖,“玉大人命黔,你說我怎么就攤上這事【徒铮” “怎么了悍募?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)洋机。 經(jīng)常有香客問我坠宴,道長(zhǎng),這世上最難降的妖魔是什么绷旗? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任喜鼓,我火速辦了婚禮,結(jié)果婚禮上衔肢,老公的妹妹穿的比我還像新娘庄岖。我一直安慰自己,他們只是感情好角骤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布隅忿。 她就那樣靜靜地躺著心剥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪背桐。 梳的紋絲不亂的頭發(fā)上优烧,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音链峭,去河邊找鬼畦娄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛弊仪,可吹牛的內(nèi)容都是我干的熙卡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼励饵,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼驳癌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起曲横,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤喂柒,失蹤者是張志新(化名)和其女友劉穎不瓶,沒想到半個(gè)月后禾嫉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚊丐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年熙参,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麦备。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡孽椰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凛篙,到底是詐尸還是另有隱情黍匾,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布呛梆,位于F島的核電站锐涯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏填物。R本人自食惡果不足惜纹腌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滞磺。 院中可真熱鬧升薯,春花似錦、人聲如沸击困。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至责语,卻和暖如春炮障,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坤候。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工胁赢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人白筹。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓智末,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親徒河。 傳聞我的和親對(duì)象是個(gè)殘疾皇子系馆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容