fibonacci數(shù)列

我記得畢業(yè)那年铆隘,面試百度卓舵,最后一面面試官讓我寫求fibonacci數(shù)列的第n項(xiàng)的值。
當(dāng)時(shí)有些意外膀钠,沒想到會讓寫這么簡單的題目边器。
一開始我用記憶化遞歸實(shí)現(xiàn),這種算法需要記錄中間的計(jì)算結(jié)果(避免重復(fù)運(yùn)算)托修,但當(dāng)n很大時(shí)有StackOverFlow的風(fēng)險(xiǎn)忘巧。
后來用遞推實(shí)現(xiàn),這種算法避免了溢出問題睦刃,但還是記錄了中間計(jì)算結(jié)果砚嘴。
我繼續(xù)優(yōu)化:

int fibonacci(final int n) {
    if (n < 1) {
        return 0;
    }
    if (n == 1 || n == 2) {
        return 1;
    }
    int a = 1;
    int b = 1;
    int x = 0;
    for (int i = 3; i <= n; i++) {
        x = a + b;
        a = b;
        b = x;
    }
    return x;
}

很長時(shí)間,我都以為這是最佳版本了涩拙,其實(shí)至少還有兩個(gè)更牛的算法际长。
通項(xiàng)公式:算法復(fù)雜度是O(1),但公式中有無理數(shù)兴泥,所以會有精度損失工育。
分而治之:請參考《編程之美》2.9

很多問題內(nèi)部的原理就是fabonacci數(shù)列,比如爬樓梯的問題搓彻。
問題看起來完了如绸≈鲂啵可是任何問題都不是孤島,一定可以延伸到一個(gè)深度怔接。比如爬樓梯問題搪泳,一個(gè)擴(kuò)展問題是打印每種可行解。
這個(gè)問題本質(zhì)上是一個(gè)無限背包問題扼脐,每次最多有2中選擇岸军。

public void print(Stack<Integer> stack, int n) {
    if (n == 0) {
        cnt++;
        System.out.println(stack);
    }
    if (n >= 2) {
        stack.push(2);
        print(stack, n - 2);
        stack.pop();
    }
    if (n >= 1) {
        stack.push(1);
        print(stack, n - 1);
        stack.pop();
    }
}

下面這段代碼也是OK的

private Stack<Integer> stack = new Stack<>();

public void print(int n) {
    if (n == 0) {
        cnt++;
        System.out.println(stack);
    }
    if (n >= 2) {
        stack.push(2);
        print(n - 2);
        stack.pop();
    }
    if (n >= 1) {
        stack.push(1);
        print(n - 1);
        stack.pop();
    }
}

2020-02-21

void stairs(int n, Stack<Integer> stack) {
    if (n < 0) {
        return;
    }
    if (n == 0) {
        System.out.println(stack);
        stack.pop();  // 經(jīng)典錯(cuò)誤:沒有push买置,怎么來的pop猴誊?
        cnt++;
        return;
    }
    stack.push(1);
    stairs(n - 1, stack);
    stack.pop();

    stack.push(2);
    stairs(n - 2, stack);
    stack.pop();
}

爬樓梯問題和斐波那契數(shù)列遞推公式相同,但初始項(xiàng)并不相同提佣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肚吏,一起剝皮案震驚了整個(gè)濱河市方妖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌须喂,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趁蕊,死亡現(xiàn)場離奇詭異坞生,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)掷伙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門是己,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人任柜,你說我怎么就攤上這事卒废。” “怎么了宙地?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵摔认,是天一觀的道長。 經(jīng)常有香客問我宅粥,道長参袱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任秽梅,我火速辦了婚禮抹蚀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘企垦。我一直安慰自己环壤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布钞诡。 她就那樣靜靜地躺著郑现,像睡著了一般湃崩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懂酱,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天竹习,我揣著相機(jī)與錄音,去河邊找鬼列牺。 笑死整陌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瞎领。 我是一名探鬼主播泌辫,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼九默!你這毒婦竟也來了震放?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤驼修,失蹤者是張志新(化名)和其女友劉穎殿遂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乙各,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡墨礁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耳峦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恩静。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蹲坷,靈堂內(nèi)的尸體忽然破棺而出驶乾,到底是詐尸還是另有隱情,我是刑警寧澤循签,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布级乐,位于F島的核電站,受9級特大地震影響县匠,放射性物質(zhì)發(fā)生泄漏唇牧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一聚唐、第九天 我趴在偏房一處隱蔽的房頂上張望丐重。 院中可真熱鬧,春花似錦杆查、人聲如沸扮惦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崖蜜。三九已至浊仆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間豫领,已是汗流浹背抡柿。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留等恐,地道東北人洲劣。 一個(gè)月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像课蔬,于是被迫代替她去往敵國和親囱稽。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

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