C#算法之大牛生小牛的問題高效解決方法
問題:
一只剛出生的小牛,4年后生一只小牛,以后每年生一只?,F(xiàn)有一只剛出生的小牛,問20年后共有牛多少只?
思路:
這種子生孫,孫生子,子子孫孫的問題,循環(huán)里面還有循環(huán)的嵌套循環(huán),一看就知道是第歸問題。
于是乎,第一個(gè)版本出現(xiàn):
public long Compute1(uint years) { //初始化為1頭牛 long count = 1; if (years <= 3) { return count; } int i = 4; while (i <= years) { int subYears = i - 3; count += Compute1((uint)(subYears)); i++; } return (long)count; }
可是這種循環(huán)在循環(huán)的做法可要把cpu老兄累壞了,你不信輸入一個(gè)100年測試一下上面的方法,我等了半天,都沒結(jié)果,改進(jìn)一下吧,老牛(牛魔王)和小牛(紅孩兒,奶奶的串種了),具有相同的生育能力,他們的生育曲線是一樣的,所以小??梢詮?fù)用老牛的生育經(jīng)驗(yàn)亞,這樣就解決了重復(fù)計(jì)算一只牛第n年的時(shí)候一共生多少只的問題了,當(dāng)年齡比較大的時(shí)候,明顯大大降低cpu的運(yùn)算次數(shù),下面是基于這種思路的算法
Hashtable table = new Hashtable(); public long Compute(uint years) { //初始化為1頭牛 long count = 1; if (years <= 3) { return count; } int i = 4; while (i <= years) { int subYears = i - 3; if (table.ContainsKey(subYears)) { count = (long)table[subYears]; } else { count += Compute((uint)(subYears)); } if (!table.ContainsKey(subYears)) { table.Add(subYears, count); } i++; } return (long)count; }
用測試程序測試一下上面的推論吧,結(jié)果如下:
1)當(dāng)輸入years比較小的時(shí)候,第一種方法耗時(shí)短,但兩者的時(shí)間基本在一個(gè)數(shù)量級上
2)當(dāng)輸入years比較大的時(shí)候,比如40以上的,第二種算法比第一種性能比在100以上,而且輸入years越高,性能比越懸殊。
測試結(jié)果截圖:
20年
50年
源程序以及測試程序:http://xiazai.jb51.net/201606/yuanma/HowMoneyCows(jb51.net).rar
以上就是本文的全部內(nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Unity 按鈕事件封裝操作(EventTriggerListener)
這篇文章主要介紹了Unity 按鈕事件封裝操作(EventTriggerListener),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04C#中的ICustomFormatter及IFormatProvider接口用法揭秘
這篇文章主要介紹了C#中的ICustomFormatter及IFormatProvider接口用法揭秘,本文能過分析一段代碼得出一些研究結(jié)果,需要的朋友可以參考下2015-06-06使用mutex實(shí)現(xiàn)應(yīng)用程序單實(shí)例運(yùn)行代碼分享
本文主要介紹了使用Mutex實(shí)現(xiàn)應(yīng)用程序單實(shí)例運(yùn)行的方法,實(shí)現(xiàn)原理是在程序啟動(dòng)時(shí),請求一個(gè)互斥體,如果能獲取對指定互斥的訪問權(quán),就繼續(xù)運(yùn)行程序,否則就退出程序2014-01-01C#?PictureBox控件方法參數(shù)及圖片刪除重命名上傳詳解
這篇文章主要為大家介紹了C#?PictureBox控件方法參數(shù)及圖片刪除重命名上傳示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08C#基于Twain協(xié)議調(diào)用掃描儀,設(shè)置多圖像輸出模式(Multi image output)
這篇文章主要介紹了C#基于Twain協(xié)議調(diào)用掃描儀,設(shè)置多圖像輸出模式(Multi image output)的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-01-01C#中正則表達(dá)式(Regex)過濾內(nèi)容的基本使用方法
在 Regex 類中提供了很多方法來操作正則表達(dá)式,這篇文章主要給大家介紹了關(guān)于C#中正則表達(dá)式(Regex)過濾內(nèi)容的基本使用方法,需要的朋友可以參考下2022-08-08