日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

经典算法题每日演练——第三题 猴子吃桃

發布時間:2025/7/14 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 经典算法题每日演练——第三题 猴子吃桃 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

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

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

?

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

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

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

? ? ? ? ? ? ? ? ?S9=2S10+2

? ? ? ? ? ? ? ? ?S8=2S9+2

? ? ? ? ? ? ? ? ? ? ?.....

? ? ? ? ? ? ? ? ?Sn=2Sn+1+2

?

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

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 }

?

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

最后就爆掉了,window中系統默認的堆棧空間是1M。

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

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 //將當前的值計算出傳遞給下一層 19 return SumPeachTail(day + 1, 2 * total + 2); 20 } 21 }

?

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

?

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

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

用的棧空間,那么最終達到的效果就是永遠不會出現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)。

?

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的经典算法题每日演练——第三题 猴子吃桃的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。