JavaScript 斐波那契數(shù)列問(wèn)題

最近不忙互婿,準(zhǔn)備鞏固一下基本功,看了點(diǎn)算法的東西辽狈。這里記錄一下斐波那契數(shù)列算法慈参,及其對(duì)于時(shí)間復(fù)雜度的優(yōu)化方法。

關(guān)于斐波那契數(shù)列稻艰,傳送門(mén)在此懂牧。
就是這樣的數(shù)列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55......
從第三項(xiàng)開(kāi)始侈净,每一項(xiàng)等于前兩項(xiàng)之和尊勿,不多BB,往下看

一畜侦、遞歸(最容易想到的方法)

這個(gè)數(shù)列的第 0 項(xiàng)我們一般看作是 0元扔,即:

數(shù)列第 n 項(xiàng) 表達(dá)式 條件
0 n = 0 時(shí)
F(n) = 1 n = 1 時(shí)
F(n - 1) + F(n - 2) n >= 2 時(shí)

代碼實(shí)現(xiàn)如下(只考慮 n 是自然數(shù)的情況):

function Fibonacci(n) {
    if (n <= 1 ) {
        return n;
    } else {
        return Fibonacci(n - 1) + Fibonacci(n - 2);
    }
}

雖說(shuō)能正確計(jì)算,但是其僅在 n <= 1 時(shí)旋膳,時(shí)間復(fù)雜度為 O(1)
當(dāng) n >= 2 時(shí)

         F(5)   
        /     \     
    F(3)       F(4)   
    /   \      /   \
F(1)   F(2)    F(2)  F(3)
      /   \   /  \   /  \

通過(guò)這個(gè)樹(shù)澎语,我們能看出它的時(shí)間復(fù)雜度是 O(2^n)

話(huà)說(shuō)大學(xué)時(shí)候,學(xué)校的 OJ 上做過(guò)這題,當(dāng)時(shí)就是用的遞歸擅羞,AC 以后就沒(méi)再繼續(xù)深入研究過(guò)

二尸变、利用數(shù)組(可將時(shí)間復(fù)雜度優(yōu)化為 O(n) )
function Fibonacci(n) {
    if (n <= 1 ) {
        return n;
    } else {
        var arr = [];
        arr[0] = 0;
        arr[1] = 1;

        for (var i = 2; i <= n; i ++) {
            arr[i] = arr[i - 1] + arr[i - 2];
        }
        return arr[n]
    }
}

也是挺巧妙的一種方法,不過(guò)需要?jiǎng)?chuàng)建數(shù)組减俏,占用了一定的內(nèi)存空間召烂,雖說(shuō)現(xiàn)在的手機(jī)、電腦也不差這點(diǎn)內(nèi)存娃承,但是還是可以?xún)?yōu)化一下

三奏夫、利用中間變量(時(shí)間復(fù)雜度也是 O(n),但可以節(jié)省空間)

同方法二思想類(lèi)似历筝,不過(guò)不使用數(shù)組

function Fibonacci(n) {
    if (n <= 1 ) {
        return n;
    } else {
        var temp0 = 0;
        var temp1 = 1;
        var fn = 0;

        for (var i = 2; i <= n; i ++) {
            fn = temp0 + temp1;
            temp0 = temp1;
            temp1 = fn;
        }
        return fn
    }
}

變量位置互換的思想

四酗昼、利用矩陣(可將時(shí)間復(fù)雜度優(yōu)化為 O(log n) )

這個(gè)就屬于用空間換時(shí)間了

話(huà)說(shuō)這個(gè)矩陣我好像還給了大學(xué)老師,等我看會(huì)了再寫(xiě)上來(lái)梳猪,尷尬

五麻削、高中數(shù)學(xué)( O(1) )

這個(gè)就是高中數(shù)學(xué)知識(shí)了,構(gòu)造等比數(shù)列春弥,求通項(xiàng)

話(huà)說(shuō)這個(gè)好像也還給高中老師了碟婆,好在高中數(shù)學(xué)還不錯(cuò),撿了回來(lái)

鵬哥帶你們復(fù)習(xí)一下高中數(shù)學(xué):

已知等比數(shù)列:1, 3, 9, 27, 81...... 求其第 n 項(xiàng)
很顯然公比為 3惕稻,直接套公式竖共,a(n) = a(1) * q^(n - 1)
即 a(n) = 3^(n - 1)

話(huà)說(shuō)這個(gè) markdown 寫(xiě)數(shù)學(xué)公式是真難受啊

然后在看這個(gè)斐波那契數(shù)列,看起來(lái)不是等比俺祠,這就需要我們?nèi)?gòu)造等比公给,眼前浮現(xiàn)出高中數(shù)學(xué)老師粉筆一揮,抑揚(yáng)頓挫的說(shuō)差后成等比的情景蜘渣,懷念啊……

推導(dǎo)過(guò)程有點(diǎn)長(zhǎng)淌铐,有空我整理下再發(fā)上來(lái),先看通項(xiàng)

通項(xiàng)公式
function Fibonacci(n) {

    var sqrt5 = Math.sqrt(5);
    var ratio = 1 / sqrt5;
    var base1 = (sqrt5 + 1) / 2;
    var base2 = (1 - sqrt5) / 2;
    var fn = ratio * (Math.pow(base1, n) + (Math.pow(base2, n)));
    
    return Math.round(fn);
}

不過(guò)這個(gè)蔫缸,浮點(diǎn)數(shù)你懂的腿准,精度上要差一些。
這里只是做以討論拾碌,沒(méi)有考慮浮點(diǎn)數(shù)加減乘除的問(wèn)題吐葱,n <= 75 時(shí)是正確的,n = 76 時(shí)就開(kāi)始有偏差了校翔,關(guān)于浮點(diǎn)數(shù)運(yùn)算問(wèn)題有空再寫(xiě)吧


根據(jù)情況選擇對(duì)應(yīng)的方法吧弟跑,數(shù)值越大,矩陣運(yùn)算的時(shí)間優(yōu)勢(shì)體現(xiàn)越明顯

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末防症,一起剝皮案震驚了整個(gè)濱河市孟辑,隨后出現(xiàn)的幾起案子哎甲,更是在濱河造成了極大的恐慌,老刑警劉巖饲嗽,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炭玫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡貌虾,警方通過(guò)查閱死者的電腦和手機(jī)础嫡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)酝惧,“玉大人榴鼎,你說(shuō)我怎么就攤上這事⊥泶剑” “怎么了巫财?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)哩陕。 經(jīng)常有香客問(wèn)我平项,道長(zhǎng),這世上最難降的妖魔是什么悍及? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任闽瓢,我火速辦了婚禮,結(jié)果婚禮上心赶,老公的妹妹穿的比我還像新娘扣讼。我一直安慰自己,他們只是感情好缨叫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布椭符。 她就那樣靜靜地躺著,像睡著了一般耻姥。 火紅的嫁衣襯著肌膚如雪销钝。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天琐簇,我揣著相機(jī)與錄音蒸健,去河邊找鬼。 笑死婉商,一個(gè)胖子當(dāng)著我的面吹牛似忧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播据某,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼橡娄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼诗箍!你這毒婦竟也來(lái)了癣籽?” 一聲冷哼從身側(cè)響起挽唉,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎筷狼,沒(méi)想到半個(gè)月后瓶籽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埂材,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年塑顺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俏险。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡严拒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出竖独,到底是詐尸還是另有隱情裤唠,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布莹痢,位于F島的核電站种蘸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏竞膳。R本人自食惡果不足惜航瞭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坦辟。 院中可真熱鬧刊侯,春花似錦、人聲如沸锉走。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)挠日。三九已至疮绷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嚣潜,已是汗流浹背冬骚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留懂算,地道東北人只冻。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像计技,于是被迫代替她去往敵國(guó)和親喜德。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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