經典演算法題每日演練 第三題 猴子吃桃

2022-02-18 08:43:47 字數 1863 閱讀 2656

猴子第一天摘下若干個桃子,當即吃了一半,還不過癮就多吃了乙個。第二天早上又將剩下的桃子吃了一半,還是不過癮又多

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

分析: 這是一套非常經典的演算法題,這個題目體現了演算法思想中的遞推思想,遞迴有兩種形式,順推和逆推,針對遞推,只要

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

令s10=1,容易看出 s9=2(s10+1), 簡化一下 

s9=2s10+2

s8=2s9+2

sn=2sn+1+2

遙想公瑾當年,老師說遞迴是最簡潔,最容易理解的,好,就用遞迴試一下:

1

class

program2"

, sum);89

console.read();10}

1112

//遞迴

13static

int sumpeach(int

day)

1420 }

當我們玩轉遞迴的時候,老師說線性遞迴會將「變數,引數,返回值」在「遞」的過程中壓棧,如果遲遲「遞」不到頭的話,棧就會越積越多,

最後就爆掉了,window中系統預設的堆疊空間是1m。

那麼解決方法是什麼? 尾遞迴,下面我們繼續上**:

1

class

program2"

, sum);89

console.read();10}

1112

//尾遞迴

那麼兩種遞迴有什麼區別呢?上圖說話。

從圖中我們可以清晰的看到「線性遞迴」和「尾遞迴」的區別,那到底有什麼本質區別呢?尾遞迴中在每次向下遞迴的過程中,都會將當前

用的棧空間,那麼最終達到的效果就是永遠不會出現stackoverflowexception了,但實際上是否真有這個效果,得要看編譯程式是否

真的給你優化了。

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

很可惜,有圖有真相,丟擲異常了,當然我是菜鳥,早已看不懂彙編了,大家也可以討論討論,目前我個人認為c#編譯器沒有給

我做這個優化:-d。

1.  代換法。

2.  遞迴樹法。

3.  主定理。

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

①:猜一下遞迴式複雜度的上界或者下界。

②:用數學歸納法證明你的複雜度是正確的。

為了具有通用性,我們將「猴子吃桃」的問題反過來寫,也就是已知s1,求s10,當然原理是一樣的,通用公式就有如下形式:

tn=2tn-1+2             ①  

假使           tn=o(n)                   ②

則必定存在乙個 c>0的自然數使

tn<=co(n)=cn           ③

③代入①知 

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

=cn-c+1

=cn-(c-1)

當c>=1時,則必有 tn<=cn  

最後得出遞迴式的時間複雜度為o(n)。

經典演算法題每日演練 第七題 KMP演算法

在大學的時候,應該在資料結構裡面都看過kmp演算法吧,不知道有多少老師對該演算法是一筆帶過的,至少我們以前是的,確實kmp演算法還是有點饒人的,如果說紅黑樹是 級的,那麼kmp演算法比紅黑樹還要 很抱歉,每次打kmp的時候,輸 入法總是提示 看毛片 三個字,嘿嘿,就叫 看毛片演算法 吧。一 bf演算...

經典演算法題每日演練 第七題 KMP演算法

在大學的時候,應該在資料結構裡面都看過kmp演算法吧,不知道有多少老師對該演算法是一筆帶過的,至少我們以前是的,確實kmp演算法還是有點饒人的,如果說紅黑樹是 級的,那麼kmp演算法比紅黑樹還要 很抱歉,每次打kmp的時候,輸 入法總是提示 看毛片 三個字,嘿嘿,就叫 看毛片演算法 吧。一 bf演算...

經典演算法題每日演練 第七題 KMP演算法

原文 經典演算法題每日演練 第七題 kmp演算法 在大學的時候,應該在資料結構裡面都看過kmp演算法吧,不知道有多少老師對該演算法是一筆帶過的,至少我們以前是的,確實kmp演算法還是有點饒人的,如果說紅黑樹是 級的,那麼kmp演算法比紅黑樹還要 很抱歉,每次打kmp的時候,輸 入法總是提示 看 三個...