亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

UCloud / 2905人閱讀

摘要:閉包尾遞歸循環(huán)迭代實(shí)現(xiàn)使用方式,主要是看實(shí)現(xiàn)思想從圖中我們可以很明顯的看出,使用尾遞歸計(jì)算斐波那契數(shù)列性能完勝直接遞歸和閉包,特別是當(dāng)數(shù)值比較大的時(shí)候,尾遞歸的作用就越明顯。

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

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

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)然這都是后話了,我開始哪里知道這么多~)

后來(lái)群里同學(xué)說(shuō)使用閉包會(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í)了比我原來(lái)的好一點(diǎn)。

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

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

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

---------------------------------分割線又來(lái)了--------------------------------

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

直接遞歸的耗時(shí)

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

閉包

尾遞歸

循環(huán)

迭代實(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

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

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

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

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

相關(guān)文章

  • 算法記錄 >> 斐波那契數(shù)列

    摘要:今天去面試筆試題斐波那契數(shù)列實(shí)現(xiàn),雖然很簡(jiǎn)單?;貋?lái)想想既然算法這么重要那就從這個(gè)開始來(lái)記錄自己的算法庫(kù)吧。在數(shù)學(xué)上,斐波納契數(shù)列以如下被以遞歸的方法定義,,。斐波拉契算法規(guī)律很簡(jiǎn)單,,觀察下數(shù)列值就很容易總結(jié)出來(lái)了。 一、寫在前面 算法這塊對(duì)于大多數(shù)程序員(包括我)來(lái)說(shuō)可能都是一個(gè)薄弱的地方,如何彌補(bǔ)尼? 每個(gè)人都知道那就是學(xué)習(xí)、特別是算法沒有任何捷徑可走。 在這記錄平時(shí)自己工作和生...

    robin 評(píng)論0 收藏0
  • 太原面經(jīng)分享:如何用js實(shí)現(xiàn)返回斐波那契數(shù)列第n個(gè)值函數(shù)

    摘要:那其實(shí)這個(gè)問題還可以換個(gè)問法實(shí)現(xiàn)一個(gè)函數(shù),輸入一個(gè)數(shù)字能返回斐波那契數(shù)列的第個(gè)值。文章預(yù)告更多的前端面試分享我都會(huì)第一時(shí)間更新在我的公眾號(hào)閏土大叔里面,歡迎關(guān)注 面試攢經(jīng)驗(yàn),lets go! 值此高考來(lái)臨之際,閑不住的我又雙叒叕出發(fā)去面試攢經(jīng)驗(yàn)了,去了公司交待一番流程后,面試官甩給了我一張A4紙,上面寫著一道js算法筆試題(一開始我并不知道這是在考察js算法),上面寫著1、1、2、3、...

    Galence 評(píng)論0 收藏0
  • js實(shí)現(xiàn)斐波那契數(shù)列

    摘要:實(shí)現(xiàn)斐波那契數(shù)列斐波那契數(shù)列最大數(shù)斐波那契數(shù)列由和開始之后的斐波那契數(shù)列系數(shù)就由之前的兩數(shù)相加。換個(gè)寫法,用箭頭函數(shù)最大數(shù)斐波那契數(shù)列由和開始 js實(shí)現(xiàn)斐波那契數(shù)列 // 斐波那契數(shù)列 let max=10000; // 最大數(shù) let arr=[0,1]; // 斐波那契數(shù)列由 0 和 1 開始 // 之后的斐波那契數(shù)列系數(shù)就由之前的兩數(shù)相加。 ...

    notebin 評(píng)論0 收藏0
  • 使用js實(shí)現(xiàn)斐波那契數(shù)列

    摘要:前言前幾天面試被問到了斐波那契數(shù)列的實(shí)現(xiàn)以及優(yōu)化的問題,當(dāng)時(shí)現(xiàn)場(chǎng)卡了挺久的,現(xiàn)在進(jìn)行一下總結(jié)使用實(shí)現(xiàn)。題目介紹斐波那契數(shù)列又被稱為黃金分割數(shù)列,指的是這樣的一個(gè)數(shù)列,它有如下遞推的方法定義是正整數(shù),請(qǐng)使用實(shí)現(xiàn)斐波那契函數(shù)。 前言 前幾天面試被問到了斐波那契數(shù)列的實(shí)現(xiàn)以及優(yōu)化的問題,當(dāng)時(shí)現(xiàn)場(chǎng)卡了挺久的,現(xiàn)在進(jìn)行一下總結(jié)(使用js實(shí)現(xiàn))。 題目介紹 ??斐波那契數(shù)列又被稱為黃金分割數(shù)列,指...

    alexnevsky 評(píng)論0 收藏0
  • js 實(shí)現(xiàn)斐波那契數(shù)列(數(shù)組緩存、動(dòng)態(tài)規(guī)劃、尾調(diào)用優(yōu)化)

    摘要:根據(jù)該規(guī)則,返回第個(gè)斐波那契數(shù)。尾遞歸函數(shù)調(diào)用自身,稱為遞歸。一個(gè)前端眼中的斐波那契數(shù)列解斐波那契數(shù)列的實(shí)用解法調(diào)用棧尾遞歸和手動(dòng)優(yōu)化尾調(diào)用優(yōu)化譯我從用寫斐波那契生成器中學(xué)到的令人驚訝的件事 斐波那契數(shù)列是以下一系列數(shù)字: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, ... 在種子數(shù)字 0 和 1 ...

    趙連江 評(píng)論0 收藏0

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

0條評(píng)論

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