一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

經(jīng)典算法題每日演練——第三題 猴子吃桃

 賈朋亮博客 2014-10-25
 猴子第一天摘下若干個(gè)桃子,當(dāng)即吃了一半,還不過癮就多吃了一個(gè)。第二天早上又將剩下的桃子吃了一半,還是不過癮又多

吃了一個(gè)。以后每天都吃前一天剩下的一半再加一個(gè)。到第10天剛好剩一個(gè)。問猴子第一天摘了多少個(gè)桃子?

分析: 這是一套非常經(jīng)典的算法題,這個(gè)題目體現(xiàn)了算法思想中的遞推思想,遞歸有兩種形式,順推和逆推,針對(duì)遞推,只要

我們找到遞推公式,問題就迎刃而解了。

令S10=1,容易看出 S9=2(S10+1), 簡(jiǎn)化一下

S9=2S10+2

S8=2S9+2

.....

Sn=2Sn+1+2

遙想公瑾當(dāng)年,老師說遞歸是最簡(jiǎn)潔,最容易理解的,好,就用遞歸試一下:

復(fù)制代碼
 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             int sum = SumPeach(1);
 6 
 7             Console.WriteLine("第一天摘得桃子有:{0}", sum);
 8 
 9             Console.Read();
10         }
11 
12         //遞歸
13         static int SumPeach(int day)
14         {
15             if (day == 10)
16                 return 1;
17 
18             return 2 * SumPeach(day + 1) + 2;
19         }
20     }
復(fù)制代碼

當(dāng)我們玩轉(zhuǎn)遞歸的時(shí)候,老師說線性遞歸會(huì)將“變量,參數(shù),返回值”在“遞”的過程中壓棧,如果遲遲“遞”不到頭的話,棧就會(huì)越積越多,

最后就爆掉了,window中系統(tǒng)默認(rèn)的堆棧空間是1M。

那么解決方法是什么? 尾遞歸,下面我們繼續(xù)上代碼:

復(fù)制代碼
 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             int sum = SumPeachTail(1, 1);
 6 
 7             Console.WriteLine("第一天摘得桃子有:{0}", sum);
 8 
 9             Console.Read();
10         }
11 
12         //尾遞歸
13         static int SumPeachTail(int day, int total)
14         {
15             if (day == 10)
16                 return total;
17 
18             //將當(dāng)前的值計(jì)算出傳遞給下一層
19             return SumPeachTail(day + 1, 2 * total + 2);
20         }
21     }
復(fù)制代碼

那么兩種遞歸有什么區(qū)別呢?上圖說話。

從圖中我們可以清晰的看到“線性遞歸”和“尾遞歸”的區(qū)別,那到底有什么本質(zhì)區(qū)別呢?尾遞歸中在每次向下遞歸的過程中,都會(huì)將當(dāng)前

層的結(jié)果計(jì)算出來后向下一層傳遞,從理論上說,傳到下一層后,上一層的參數(shù)值已經(jīng)沒有存在的必要了,可以清除上一層中的變量占

用的棧空間,那么最終達(dá)到的效果就是永遠(yuǎn)不會(huì)出現(xiàn)StackOverflowException了,但實(shí)際上是否真有這個(gè)效果,得要看編譯程序是否

真的給你優(yōu)化了。

下面我們將day=10改成day=int.MaxValue,跑一下程序看看:

很可惜,有圖有真相,拋出異常了,當(dāng)然我是菜鳥,早已看不懂匯編了,大家也可以討論討論,目前我個(gè)人認(rèn)為C#編譯器沒有給

我做這個(gè)優(yōu)化:-D。

下一步我們就要計(jì)算一下這個(gè)遞歸的時(shí)間復(fù)雜度是多少,關(guān)于求“遞歸”的時(shí)間復(fù)雜度主要有三種:

1. 代換法。

2. 遞歸樹法。

3. 主定理。

這一篇我就說下代換法,作法如下

①:猜一下遞歸式復(fù)雜度的上界或者下界。

②:用數(shù)學(xué)歸納法證明你的復(fù)雜度是正確的。

為了具有通用性,我們將“猴子吃桃”的問題反過來寫,也就是已知S1,求S10,當(dāng)然原理是一樣的,通用公式就有如下形式:

Tn=2Tn-1+2 ①

假使 Tn=O(n) ②

則必定存在一個(gè) c>0的自然數(shù)使

Tn<=cO(n)=cn ③

③代入①知

Tn<=2c(n-1)+2=2cn-2c+2

=cn-c+1

=cn-(c-1)

當(dāng)c>=1時(shí),則必有 Tn<=cn

最后得出遞歸式的時(shí)間復(fù)雜度為O(N)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    护士又紧又深又湿又爽的视频| 国产精品日韩欧美第一页| 久草视频在线视频在线观看| 欧美精品专区一区二区| 午夜福利网午夜福利网| 熟妇人妻av中文字幕老熟妇| 久久这里只有精品中文字幕| 国产一区二区三区不卡| 在线免费观看一二区视频| 麻豆最新出品国产精品| 亚洲国产成人av毛片国产| 国产欧美性成人精品午夜| 福利一区二区视频在线| 国产一级精品色特级色国产| 欧美一区二区三区十区| 黄色av尤物白丝在线播放网址 | 老鸭窝老鸭窝一区二区| 日韩欧美第一页在线观看| 亚洲第一视频少妇人妻系列| 九九久久精品久久久精品| 99久久精品国产麻豆| 日本黄色美女日本黄色| 日韩蜜桃一区二区三区| 日本熟女中文字幕一区| 亚洲熟女熟妇乱色一区| 国产欧美日韩精品一区二区| 日韩蜜桃一区二区三区| 激情图日韩精品中文字幕| 热久久这里只有精品视频| 亚洲国产91精品视频| 日韩欧美三级中文字幕| 国产免费黄片一区二区| 91在线国内在线中文字幕| 老司机精品在线你懂的| 内射精子视频欧美一区二区| 亚洲最大福利在线观看| 亚洲中文字幕综合网在线| 色婷婷激情五月天丁香| 老司机精品福利视频在线播放| 黑人粗大一区二区三区| 亚洲午夜av一区二区|