常見(jiàn)算法1——遞歸算法

遞歸算法就是通過(guò)自身不斷反復(fù)調(diào)用自身以解決問(wèn)題,其中最經(jīng)典的也就是漢諾達(dá)和斐波納契數(shù)列的問(wèn)題了休吠。
1.漢諾塔問(wèn)題
在印度,有這么一個(gè)古老的傳說(shuō):在世界中心貝拿勒斯(在印度北部)的圣廟里,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創(chuàng)造世界的時(shí)候训裆,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔蜀铲。不論白天黑夜边琉,總有一個(gè)僧侶在按照下面的法則移動(dòng)這些金片,一次只移動(dòng)一片记劝,不管在哪根針上变姨,小片必在大片上面。當(dāng)所有的金片都從梵天穿好的那根針上移到另外一概針上時(shí)厌丑,世界就將在一聲霹靂中消滅定欧,梵塔、廟宇和眾生都將同歸于盡怒竿。


image.png

分析:挪到C的金片也是從下到上由大到小的順序排列砍鸠,那么A之剩下最下面的金片移動(dòng)到C的時(shí)候,C上面是不可以有金片的愧口,這個(gè)時(shí)候A上面只有第n個(gè)金片睦番,B上面有n-1個(gè)金片,C上面沒(méi)有金片,然后這個(gè)情況就和剛開(kāi)始情況相同了托嚣,只不過(guò)A和B顛倒了位置而已巩检。
(1)n-1個(gè)金片從A通過(guò)C移動(dòng)到B,n-1個(gè)金片從A通過(guò)C移動(dòng)到B也是不斷調(diào)用自身逐步縮小范圍示启。通過(guò)遞歸調(diào)用后兢哭,就完成了A上面僅剩下最大的金片,C上面沒(méi)有金片夫嗓,B上面有n-1個(gè)金片迟螺。
(2)最大的那個(gè)金片從A移動(dòng)到C
(3)調(diào)用自身重復(fù)剛開(kāi)始的情況,只不過(guò)現(xiàn)在有金片的是B,即B通過(guò)A把金片移動(dòng)到C。

image.png

2.斐波納契數(shù)列
2.1生兔子問(wèn)題
古典問(wèn)題:3個(gè)月起每個(gè)月都生一對(duì)兔子奢赂,小兔子長(zhǎng)到第三個(gè)月后每個(gè)月又生一對(duì)兔子,假如兔子都不死窍株,問(wèn)每個(gè)月的兔子總數(shù)為多少?下面先從小到大分析下這個(gè)情況
分析:假設(shè)將兔子分為小中大三種攻柠,兔子從出生后從第三個(gè)月開(kāi)始每個(gè)月就會(huì)生出一對(duì)兔子球订,也就是一旦兔子變?yōu)榇笸米幽敲此蜕艘粚?duì)兔子
分析情況圖如下


image.png

很明顯這個(gè)是一個(gè)為斐波那契數(shù)列,即如果用f(n)表示第n個(gè)月的兔子的對(duì)數(shù)瑰钮,那么f(n)=f(n-1)+f(n-2)


image.png

拓展:生兔子問(wèn)題的變種冒滩,如果將3個(gè)月改為4個(gè)月呢
image.png

那么F(n) = f(n-1)+ f(n-3)
同理,如果第2個(gè)月開(kāi)始生兔子浪谴,那么F(n) = f(n-1)+ f(n-1)=2*f(n-1);

2.2走臺(tái)階問(wèn)題
一個(gè)臺(tái)階總共有n級(jí)开睡,如果一次可以跳1級(jí),也可以跳2級(jí)苟耻。求總共有多少總跳法士八,并分析算法的時(shí)間復(fù)雜度。
分析:假設(shè)我們現(xiàn)在還有最后一步要走梁呈,可能的情況有哪些?
(1)我們站在第9級(jí)上蘸秘,一步1級(jí)后到達(dá)頂端官卡;
(2)我們站在第8級(jí)上,一步2級(jí)后到達(dá)頂端醋虏;
所以寻咒,最后一步可以走1級(jí)或者2級(jí),不外乎兩種情況颈嚼。
再假設(shè)毛秘,已知從0級(jí)到9級(jí)的走法有M種,從0級(jí)到8級(jí)的走法有N種,那么從0到10級(jí)的走法和M叫挟、N有什么關(guān)系呢艰匙?從0到10級(jí)的走法一共是多少種呢?答案是M+N抹恳。
所以逐步遞歸员凝,說(shuō)白了,這還是個(gè)Fibnacci數(shù)列奋献。即f(n)=f(n-1)+f(n-2)健霹,事件復(fù)雜度是2^n

臺(tái)階問(wèn)題的變種:
一個(gè)臺(tái)階總共有n級(jí),如果一次可以跳1級(jí)瓶蚂,也可以跳2級(jí).....也可以跳n級(jí)糖埋。求總共有多少總跳法

分析:用Fib(n)表示跳上n階臺(tái)階的跳法數(shù)。如果按照定義窃这,F(xiàn)ib(0)肯定需要為0瞳别,否則沒(méi)有意義。但是我們?cè)O(shè)定Fib(0) = 1钦听;n = 0是特殊情況洒试,通過(guò)下面的分析就會(huì)知道,強(qiáng)制令Fib(0) = 1很有好處朴上。因?yàn)镕ib(0)等于幾都不影響我們解題垒棋,但是會(huì)影響我們下面的分析理解。

當(dāng)n = 1 時(shí)痪宰, 只有一種跳法叼架,即1階跳:Fib(1) = 1;

當(dāng)n = 2 時(shí), 有兩種跳的方式衣撬,一階跳和二階跳:Fib(2) = 2;

到這里為止乖订,和普通跳臺(tái)階是一樣的。

當(dāng)n = 3 時(shí)具练,有三種跳的方式乍构,第一次跳出一階后,對(duì)應(yīng)Fib(3-1)種跳法扛点; 第一次跳出二階后哥遮,對(duì)應(yīng)Fib(3-2)種跳法;第一次跳出三階后陵究,只有這一種跳法眠饮。Fib(3) = Fib(2) + Fib(1)+ 1 = Fib(2) + Fib(1) + Fib(0) = 4;

當(dāng)n = 4時(shí),有四種方式:第一次跳出一階铜邮,對(duì)應(yīng)Fib(4-1)種跳法仪召;第一次跳出二階寨蹋,對(duì)應(yīng)Fib(4-2)種跳法;第一次跳出三階扔茅,對(duì)應(yīng)Fib(4-3)種跳法已旧;第一次跳出四階,只有這一種跳法咖摹。所以评姨,F(xiàn)ib(4) = Fib(4-1) + Fib(4-2) + Fib(4-3) + 1 = Fib(4-1) + Fib(4-2) + Fib(4-3) + Fib(4-4) 種跳法。

當(dāng)n = n 時(shí)萤晴,共有n種跳的方式吐句,第一次跳出一階后,后面還有Fib(n-1)中跳法店读; 第一次跳出二階后嗦枢,后面還有Fib(n-2)中跳法..........................第一次跳出n階后,后面還有 Fib(n-n)中跳法屯断。Fib(n) = Fib(n-1)+Fib(n-2)+Fib(n-3)+..........+Fib(n-n) = Fib(0)+Fib(1)+Fib(2)+.......+Fib(n-1)文虏。

通過(guò)上述分析,我們就得到了通項(xiàng)公式:

             Fib(n) =  Fib(0)+Fib(1)+Fib(2)+.......+ Fib(n-2) + Fib(n-1)

因此殖演,有 Fib(n-1)=Fib(0)+Fib(1)+Fib(2)+.......+Fib(n-2)

兩式相減得:Fib(n)-Fib(n-1) = Fib(n-1) =====》 Fib(n) = 2*Fib(n-1) n >= 3

這就是我們需要的遞推公式:Fib(n) = 2*Fib(n-1) n >= 3

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末氧秘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子趴久,更是在濱河造成了極大的恐慌丸相,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彼棍,死亡現(xiàn)場(chǎng)離奇詭異灭忠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)座硕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)弛作,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人华匾,你說(shuō)我怎么就攤上這事映琳。” “怎么了蜘拉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵刊头,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我诸尽,道長(zhǎng),這世上最難降的妖魔是什么印颤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任您机,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘际看。我一直安慰自己咸产,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布仲闽。 她就那樣靜靜地躺著脑溢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赖欣。 梳的紋絲不亂的頭發(fā)上屑彻,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音顶吮,去河邊找鬼社牲。 笑死,一個(gè)胖子當(dāng)著我的面吹牛悴了,可吹牛的內(nèi)容都是我干的搏恤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼湃交,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼熟空!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起搞莺,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤息罗,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后腮敌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體阱当,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年糜工,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弊添。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捌木,死狀恐怖油坝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刨裆,我是刑警寧澤澈圈,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站帆啃,受9級(jí)特大地震影響瞬女,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜努潘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一诽偷、第九天 我趴在偏房一處隱蔽的房頂上張望坤学。 院中可真熱鬧,春花似錦报慕、人聲如沸深浮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)飞苇。三九已至,卻和暖如春蜗顽,著一層夾襖步出監(jiān)牢的瞬間布卡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工诫舅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留羽利,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓刊懈,卻偏偏與公主長(zhǎng)得像这弧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虚汛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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